quasar 2.7.7 → 2.8.1

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 (175) hide show
  1. package/dist/api/Loading.json +57 -1
  2. package/dist/api/QBtnDropdown.json +4 -0
  3. package/dist/api/QEditor.json +105 -97
  4. package/dist/api/QField.json +6 -0
  5. package/dist/api/QFile.json +6 -0
  6. package/dist/api/QInput.json +6 -0
  7. package/dist/api/QSelect.json +6 -0
  8. package/dist/api/QTable.json +36 -49
  9. package/dist/api/QUploader.json +86 -8
  10. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  11. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  12. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  13. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  14. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  15. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  16. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  17. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  18. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  19. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  20. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  21. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  22. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  23. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  24. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  25. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  26. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  27. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  28. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +2 -2
  33. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +2 -2
  42. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +2 -2
  43. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +2 -2
  44. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  46. package/dist/icon-set/themify.umd.prod.js +1 -1
  47. package/dist/lang/ar-TN.umd.prod.js +1 -1
  48. package/dist/lang/ar.umd.prod.js +1 -1
  49. package/dist/lang/az-Latn.umd.prod.js +1 -1
  50. package/dist/lang/bg.umd.prod.js +1 -1
  51. package/dist/lang/bn.umd.prod.js +1 -1
  52. package/dist/lang/ca.umd.prod.js +1 -1
  53. package/dist/lang/cs.umd.prod.js +1 -1
  54. package/dist/lang/da.umd.prod.js +1 -1
  55. package/dist/lang/de.umd.prod.js +1 -1
  56. package/dist/lang/el.umd.prod.js +1 -1
  57. package/dist/lang/en-GB.umd.prod.js +1 -1
  58. package/dist/lang/en-US.umd.prod.js +1 -1
  59. package/dist/lang/eo.umd.prod.js +1 -1
  60. package/dist/lang/es.umd.prod.js +1 -1
  61. package/dist/lang/et.umd.prod.js +1 -1
  62. package/dist/lang/eu.umd.prod.js +1 -1
  63. package/dist/lang/fa-IR.umd.prod.js +1 -1
  64. package/dist/lang/fa.umd.prod.js +1 -1
  65. package/dist/lang/fi.umd.prod.js +1 -1
  66. package/dist/lang/fr.umd.prod.js +1 -1
  67. package/dist/lang/gn.umd.prod.js +1 -1
  68. package/dist/lang/he.umd.prod.js +1 -1
  69. package/dist/lang/hr.umd.prod.js +1 -1
  70. package/dist/lang/hu.umd.prod.js +1 -1
  71. package/dist/lang/id.umd.prod.js +1 -1
  72. package/dist/lang/is.umd.prod.js +1 -1
  73. package/dist/lang/it.umd.prod.js +1 -1
  74. package/dist/lang/ja.umd.prod.js +1 -1
  75. package/dist/lang/km.umd.prod.js +1 -1
  76. package/dist/lang/ko-KR.umd.prod.js +1 -1
  77. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  78. package/dist/lang/kz.umd.prod.js +1 -1
  79. package/dist/lang/lt.umd.prod.js +1 -1
  80. package/dist/lang/lu.umd.prod.js +1 -1
  81. package/dist/lang/lv.umd.prod.js +1 -1
  82. package/dist/lang/ml.umd.prod.js +1 -1
  83. package/dist/lang/mm.umd.prod.js +1 -1
  84. package/dist/lang/ms.umd.prod.js +1 -1
  85. package/dist/lang/my.umd.prod.js +1 -1
  86. package/dist/lang/nb-NO.umd.prod.js +1 -1
  87. package/dist/lang/nl.umd.prod.js +1 -1
  88. package/dist/lang/pl.umd.prod.js +1 -1
  89. package/dist/lang/pt-BR.umd.prod.js +1 -1
  90. package/dist/lang/pt.umd.prod.js +1 -1
  91. package/dist/lang/ro.umd.prod.js +1 -1
  92. package/dist/lang/ru.umd.prod.js +1 -1
  93. package/dist/lang/sk.umd.prod.js +1 -1
  94. package/dist/lang/sl.umd.prod.js +1 -1
  95. package/dist/lang/sm.umd.prod.js +1 -1
  96. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  97. package/dist/lang/sr.umd.prod.js +1 -1
  98. package/dist/lang/sv.umd.prod.js +1 -1
  99. package/dist/lang/ta.umd.prod.js +1 -1
  100. package/dist/lang/th.umd.prod.js +1 -1
  101. package/dist/lang/tr.umd.prod.js +1 -1
  102. package/dist/lang/ug.umd.prod.js +1 -1
  103. package/dist/lang/uk.umd.prod.js +1 -1
  104. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  105. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  106. package/dist/lang/vi.umd.prod.js +1 -1
  107. package/dist/lang/zh-CN.umd.prod.js +1 -1
  108. package/dist/lang/zh-TW.umd.prod.js +1 -1
  109. package/dist/quasar.cjs.prod.js +2 -2
  110. package/dist/quasar.esm.js +39647 -0
  111. package/dist/quasar.esm.prod.js +2 -2
  112. package/dist/quasar.sass +1 -1
  113. package/dist/quasar.umd.js +355 -295
  114. package/dist/quasar.umd.prod.js +2 -2
  115. package/dist/transforms/import-map.json +1 -0
  116. package/dist/types/index.d.ts +223 -117
  117. package/dist/web-types/web-types.json +6 -1
  118. package/package.json +1 -1
  119. package/src/components/banner/QBanner.js +2 -2
  120. package/src/components/bar/QBar.js +2 -2
  121. package/src/components/btn-dropdown/QBtnDropdown.js +8 -2
  122. package/src/components/btn-dropdown/QBtnDropdown.json +5 -0
  123. package/src/components/card/QCard.js +2 -2
  124. package/src/components/carousel/QCarousel.js +1 -1
  125. package/src/components/date/QDate.js +6 -6
  126. package/src/components/dialog-plugin/DialogPlugin.js +1 -1
  127. package/src/components/editor/QEditor.js +5 -5
  128. package/src/components/editor/QEditor.json +76 -67
  129. package/src/components/infinite-scroll/QInfiniteScroll.js +7 -7
  130. package/src/components/page-sticky/use-page-sticky.js +1 -2
  131. package/src/components/popup-edit/QPopupEdit.js +10 -10
  132. package/src/components/popup-proxy/QPopupProxy.js +7 -7
  133. package/src/components/pull-to-refresh/QPullToRefresh.js +3 -3
  134. package/src/components/range/QRange.js +5 -1
  135. package/src/components/resize-observer/QResizeObserver.js +6 -6
  136. package/src/components/scroll-area/QScrollArea.js +25 -25
  137. package/src/components/scroll-observer/QScrollObserver.js +3 -3
  138. package/src/components/select/QSelect.js +2 -1
  139. package/src/components/slider/QSlider.js +5 -1
  140. package/src/components/slider/use-slider.js +1 -1
  141. package/src/components/table/QTable.json +28 -50
  142. package/src/components/table/table-column-selection.js +1 -1
  143. package/src/components/table/table-pagination.js +0 -4
  144. package/src/components/table/table-sort.js +1 -1
  145. package/src/components/time/QTime.js +5 -5
  146. package/src/components/tree/QTree.js +2 -2
  147. package/src/components/uploader/QUploader.json +107 -0
  148. package/src/components/uploader/__tests__/QUploader.spec.js +33 -2
  149. package/src/components/uploader/uploader-core.js +48 -53
  150. package/src/composables/private/use-field.js +5 -4
  151. package/src/composables/private/use-file.js +1 -0
  152. package/src/composables/private/use-panel.js +7 -7
  153. package/src/composables/private/use-portal.js +7 -7
  154. package/src/composables/private/use-validate.json +7 -0
  155. package/src/directives/ClosePopup.js +4 -4
  156. package/src/directives/Intersection.js +1 -1
  157. package/src/index.dev.js +16 -0
  158. package/src/{index.all.js → index.ssr.js} +0 -0
  159. package/src/install-quasar.js +1 -1
  160. package/src/plugins/Loading.js +122 -73
  161. package/src/plugins/Loading.json +48 -1
  162. package/src/plugins/LoadingBar.js +1 -1
  163. package/src/plugins/Notify.js +1 -1
  164. package/src/utils/create-uploader-component.js +1 -1
  165. package/src/utils/date.js +1 -1
  166. package/src/utils/dom.js +2 -5
  167. package/src/utils/{private/is.js → is.js} +11 -7
  168. package/src/utils/morph.js +1 -1
  169. package/src/utils/open-url.js +7 -2
  170. package/src/utils/private/click-outside.js +3 -3
  171. package/src/utils/private/date-persian.js +12 -12
  172. package/src/utils/private/portal.js +24 -24
  173. package/src/utils/private/vm.js +10 -9
  174. package/src/utils/private/web-storage.js +1 -1
  175. package/src/utils.js +2 -0
@@ -185,6 +185,7 @@
185
185
  "format": "src/utils/format.js",
186
186
  "frameDebounce": "src/utils/frame-debounce.js",
187
187
  "getCssVar": "src/utils/get-css-var.js",
188
+ "is": "src/utils/is.js",
188
189
  "morph": "src/utils/morph.js",
189
190
  "openURL": "src/utils/open-url.js",
190
191
  "patterns": "src/utils/patterns.js",
@@ -244,57 +244,14 @@ export interface Loading {
244
244
  /**
245
245
  * Activate and show
246
246
  * @param opts All props are optional
247
+ * @returns Calling this function with no parameters hides the group; When called with one Object parameter then it updates the Loading group (specified properties are shallow merged with the group ones; note that group cannot be changed while updating and it is ignored)
247
248
  */
248
- show: (opts?: {
249
- /**
250
- * Wait a number of millisecond before showing; Not worth showing for 100ms for example then hiding it, so wait until you're sure it's a process that will take some considerable amount of time
251
- */
252
- delay?: number;
253
- /**
254
- * Message to display
255
- */
256
- message?: string;
257
- /**
258
- * Render the message as HTML; This can lead to XSS attacks so make sure that you sanitize the message first
259
- */
260
- html?: boolean;
261
- /**
262
- * Content wrapped element custom classes
263
- */
264
- boxClass?: string;
265
- /**
266
- * Spinner size (in pixels)
267
- */
268
- spinnerSize?: number;
269
- /**
270
- * Color name for spinner from the Quasar Color Palette
271
- */
272
- spinnerColor?: string;
273
- /**
274
- * Color name for text from the Quasar Color Palette
275
- */
276
- messageColor?: string;
277
- /**
278
- * Color name for background from the Quasar Color Palette
279
- */
280
- backgroundColor?: string;
281
- /**
282
- * One of the QSpinners
283
- */
284
- spinner?: Component;
285
- /**
286
- * Add a CSS class to easily customize the component
287
- */
288
- customClass?: string;
289
- /**
290
- * Ignore the default configuration (set by setDefaults()) for this instance only
291
- */
292
- ignoreDefaults?: boolean;
293
- }) => void;
249
+ show: (opts?: QLoadingShowOptions) => (props?: QLoadingUpdateOptions) => void;
294
250
  /**
295
251
  * Hide it
252
+ * @param group Optional Loading group name to hide instead of hiding all groups
296
253
  */
297
- hide: () => void;
254
+ hide: (group?: string) => void;
298
255
  /**
299
256
  * Merge options into the default ones
300
257
  * @param opts Pick the subprop you want to define
@@ -308,6 +265,11 @@ export interface Loading {
308
265
  * Message to display
309
266
  */
310
267
  message?: string;
268
+ /**
269
+ * Default Loading group name
270
+ * Default value: __default_quasar_group__
271
+ */
272
+ group?: string;
311
273
  /**
312
274
  * Spinner size (in pixels)
313
275
  */
@@ -1430,6 +1392,10 @@ export interface QBtnDropdownSlots {
1430
1392
  * Customize main button's content through this slot, unless you're using the 'icon' and 'label' props
1431
1393
  */
1432
1394
  label: () => VNode[];
1395
+ /**
1396
+ * Override the default QSpinner when in 'loading' state
1397
+ */
1398
+ loading: () => VNode[];
1433
1399
  }
1434
1400
 
1435
1401
  export interface QBtnDropdown
@@ -3355,58 +3321,9 @@ export interface QEditorProps {
3355
3321
  definitions?:
3356
3322
  | {
3357
3323
  /**
3358
- * Label of the button
3359
- */
3360
- label?: string;
3361
- /**
3362
- * Text to be displayed as a tooltip on hover
3324
+ * Command definition
3363
3325
  */
3364
- tip?: string;
3365
- /**
3366
- * HTML formatted text to be displayed within a tooltip on hover
3367
- */
3368
- htmlTip?: string;
3369
- /**
3370
- * Icon of the button
3371
- */
3372
- icon?: string;
3373
- /**
3374
- * Keycode of a key to be used together with the <ctrl> key for use as a shortcut to trigger this element
3375
- */
3376
- key?: number;
3377
- /**
3378
- * Either this or "cmd" is required. Function for when button gets clicked/tapped.
3379
- */
3380
- handler?: () => void;
3381
- /**
3382
- * Either this or "handler" is required. This must be a valid execCommand method according to the designMode API.
3383
- */
3384
- cmd?: string;
3385
- /**
3386
- * Only set a param if using a "cmd". This is commonly text or HTML to inject, but is highly dependent upon the specific cmd being called.
3387
- */
3388
- param?: string;
3389
- /**
3390
- * Is button disabled?
3391
- * @returns If true, the button will be disabled
3392
- */
3393
- disable?: boolean | (() => boolean);
3394
- /**
3395
- * Pass the value "no-state" if the button should not have an "active" state
3396
- */
3397
- type?: "no-state";
3398
- /**
3399
- * Lock the button label, so it doesn't change based on the child option selected.
3400
- */
3401
- fixedLabel?: boolean;
3402
- /**
3403
- * Lock the button icon, so it doesn't change based on the child option selected.
3404
- */
3405
- fixedIcon?: boolean;
3406
- /**
3407
- * Highlight the toolbar button, when a child option has been selected.
3408
- */
3409
- highlight?: boolean;
3326
+ [commandName: string]: QEditorCommand;
3410
3327
  }
3411
3328
  | undefined;
3412
3329
  /**
@@ -4291,6 +4208,10 @@ export interface QField extends ComponentPublicInstance<QFieldProps> {
4291
4208
  * Blur field (lose focus)
4292
4209
  */
4293
4210
  blur: () => void;
4211
+ /**
4212
+ * Whether the component is in error state
4213
+ */
4214
+ readonly hasError: boolean;
4294
4215
  }
4295
4216
 
4296
4217
  export interface QFileProps {
@@ -4653,6 +4574,10 @@ export interface QFile extends ComponentPublicInstance<QFileProps> {
4653
4574
  * @returns The underlying native input DOM Element
4654
4575
  */
4655
4576
  getNativeElement: () => any;
4577
+ /**
4578
+ * Whether the component is in error state
4579
+ */
4580
+ readonly hasError: boolean;
4656
4581
  }
4657
4582
 
4658
4583
  export interface QFooterProps {
@@ -5442,6 +5367,10 @@ export interface QInput extends ComponentPublicInstance<QInputProps> {
5442
5367
  * @returns The underlying native input/textarea DOM Element
5443
5368
  */
5444
5369
  getNativeElement: () => any;
5370
+ /**
5371
+ * Whether the component is in error state
5372
+ */
5373
+ readonly hasError: boolean;
5445
5374
  }
5446
5375
 
5447
5376
  export interface QIntersectionProps {
@@ -8481,6 +8410,10 @@ export interface QSelect extends ComponentPublicInstance<QSelectProps> {
8481
8410
  * @returns Option is disabled or not
8482
8411
  */
8483
8412
  isOptionDisabled: (opt: any) => boolean;
8413
+ /**
8414
+ * Whether the component is in error state
8415
+ */
8416
+ readonly hasError: boolean;
8484
8417
  }
8485
8418
 
8486
8419
  export interface QSeparatorProps {
@@ -10244,19 +10177,9 @@ export interface QTableProps {
10244
10177
  rowsPerPage: number;
10245
10178
  };
10246
10179
  /**
10247
- * Filter method (the 'filter-method' prop)
10248
- * @param rows Array of rows
10249
- * @param terms Terms to filter with (is essentially the 'filter' prop value)
10250
- * @param cols Optional column definitions
10251
- * @param getCellValue Optional function to get a cell value
10252
- * @returns Filtered rows
10180
+ * String/Object to filter table with (the 'filter' prop)
10253
10181
  */
10254
- filter: (
10255
- rows: readonly any[],
10256
- terms: string | any,
10257
- cols?: readonly any[],
10258
- getCellValue?: (col: any, row: any) => any
10259
- ) => readonly any[];
10182
+ filter?: string | any;
10260
10183
  /**
10261
10184
  * Function to get a cell value
10262
10185
  * @param col Column name from column definitions
@@ -11271,6 +11194,10 @@ export interface QTable extends ComponentPublicInstance<QTableProps> {
11271
11194
  * How many rows per page? 0 means Infinite
11272
11195
  */
11273
11196
  rowsPerPage?: number;
11197
+ /**
11198
+ * For server-side fetching only. How many total database rows are there to be added to the table.
11199
+ */
11200
+ rowsNumber?: number;
11274
11201
  };
11275
11202
  /**
11276
11203
  * Filtering method (the 'filter-method' prop)
@@ -11374,6 +11301,18 @@ export interface QTable extends ComponentPublicInstance<QTableProps> {
11374
11301
  | "center-force"
11375
11302
  | "end-force"
11376
11303
  ) => void;
11304
+ /**
11305
+ * The filtered and sorted rows (same as the rows prop if using server-side fetching)
11306
+ */
11307
+ readonly filteredSortedRows: readonly any[];
11308
+ /**
11309
+ * Paginated, filtered, and sorted rows (same as the rows prop if using server-side fetching)
11310
+ */
11311
+ readonly computedRows: readonly any[];
11312
+ /**
11313
+ * The number of computed rows
11314
+ */
11315
+ readonly computedRowsNumber: number;
11377
11316
  }
11378
11317
 
11379
11318
  export interface QTdProps {
@@ -12833,15 +12772,15 @@ export interface QUploaderSlots {
12833
12772
 
12834
12773
  export interface QUploader extends ComponentPublicInstance<QUploaderProps> {
12835
12774
  /**
12836
- * Trigger file pick; Must be called as a direct consequence of user interaction (eg. in a click handler), due to browsers security policy
12837
- * @param evt JS event object
12775
+ * Trigger the file picker dialog; The event must come from a user interaction event handler
12776
+ * @param evt JS event object of the original user interaction handler
12838
12777
  */
12839
- pickFiles: (evt?: Event) => void;
12778
+ pickFiles: (evt: Event) => void;
12840
12779
  /**
12841
- * Add files programmatically
12842
- * @param files Array of files (instances of File)
12780
+ * Manually add files to the queue
12781
+ * @param files Must be an array of instances of JS File type
12843
12782
  */
12844
- addFiles: (files: FileList | readonly any[]) => void;
12783
+ addFiles: (files: readonly any[]) => void;
12845
12784
  /**
12846
12785
  * Start uploading (same as clicking the upload button)
12847
12786
  */
@@ -12867,6 +12806,58 @@ export interface QUploader extends ComponentPublicInstance<QUploaderProps> {
12867
12806
  * @param file File to remove (instance of File)
12868
12807
  */
12869
12808
  removeFile: (file: any) => void;
12809
+ /**
12810
+ * Update the status of a file
12811
+ * @param file File to update (instance of File)
12812
+ * @param status Status of file
12813
+ * @param uploadedSize The number of uploaded bytes of the file; Is required explicitly only when status is NOT 'uploaded'
12814
+ */
12815
+ updateFileStatus: (
12816
+ file: any,
12817
+ status: "idle" | "failed" | "uploading" | "uploaded",
12818
+ uploadedSize: number
12819
+ ) => void;
12820
+ /**
12821
+ * Is the component alive (activated but not unmounted); Useful to determine if you still need to compute anything going further
12822
+ * @returns If true, the current component is still activated and mounted
12823
+ */
12824
+ isAlive: () => boolean;
12825
+ /**
12826
+ * List of all files
12827
+ */
12828
+ readonly files: readonly any[];
12829
+ /**
12830
+ * List of files that are waiting to be uploaded
12831
+ */
12832
+ readonly queuedFiles: readonly any[];
12833
+ /**
12834
+ * List of files that have been uploaded
12835
+ */
12836
+ readonly uploadedFiles: readonly any[];
12837
+ /**
12838
+ * Size of all uploaded files in bytes
12839
+ */
12840
+ readonly uploadedSize: number;
12841
+ /**
12842
+ * Label for the size total of all files
12843
+ */
12844
+ readonly uploadSizeLabel: string;
12845
+ /**
12846
+ * Label for the upload progress (in %)
12847
+ */
12848
+ readonly uploadProgressLabel: string;
12849
+ /**
12850
+ * Whether new files can be added to the list
12851
+ */
12852
+ readonly canAddFiles: boolean;
12853
+ /**
12854
+ * Whether the files can be uploaded
12855
+ */
12856
+ readonly canUpload: boolean;
12857
+ /**
12858
+ * The component state is set as busy; User should not be able to interact with the component
12859
+ */
12860
+ readonly isBusy: boolean;
12870
12861
  }
12871
12862
 
12872
12863
  export interface QUploaderAddTriggerProps {}
@@ -13326,6 +13317,58 @@ export interface QDialogOptions {
13326
13317
  componentProps?: any;
13327
13318
  }
13328
13319
 
13320
+ export interface QLoadingShowOptions {
13321
+ /**
13322
+ * Wait a number of millisecond before showing; Not worth showing for 100ms for example then hiding it, so wait until you're sure it's a process that will take some considerable amount of time
13323
+ */
13324
+ delay?: number;
13325
+ /**
13326
+ * Message to display
13327
+ */
13328
+ message?: string;
13329
+ /**
13330
+ * Loading group name
13331
+ */
13332
+ group?: string;
13333
+ /**
13334
+ * Render the message as HTML; This can lead to XSS attacks so make sure that you sanitize the message first
13335
+ */
13336
+ html?: boolean;
13337
+ /**
13338
+ * Content wrapped element custom classes
13339
+ */
13340
+ boxClass?: string;
13341
+ /**
13342
+ * Spinner size (in pixels)
13343
+ */
13344
+ spinnerSize?: number;
13345
+ /**
13346
+ * Color name for spinner from the Quasar Color Palette
13347
+ */
13348
+ spinnerColor?: string;
13349
+ /**
13350
+ * Color name for text from the Quasar Color Palette
13351
+ */
13352
+ messageColor?: string;
13353
+ /**
13354
+ * Color name for background from the Quasar Color Palette
13355
+ */
13356
+ backgroundColor?: string;
13357
+ /**
13358
+ * One of the QSpinners
13359
+ */
13360
+ spinner?: Component;
13361
+ /**
13362
+ * Add a CSS class to easily customize the component
13363
+ */
13364
+ customClass?: string;
13365
+ /**
13366
+ * Ignore the default configuration (set by setDefaults()) for this instance only
13367
+ */
13368
+ ignoreDefaults?: boolean;
13369
+ }
13370
+
13371
+ import { QLoadingUpdateOptions } from "./api";
13329
13372
  import { WebStorageGetItemMethodType } from "./api";
13330
13373
  import { WebStorageGetIndexMethodType } from "./api";
13331
13374
  import { WebStorageGetKeyMethodType } from "./api";
@@ -13469,6 +13512,62 @@ export interface QNotifyCreateOptions {
13469
13512
 
13470
13513
  import { QNotifyUpdateOptions } from "./api";
13471
13514
  import { QNotifyOptions } from "./api";
13515
+ export interface QEditorCommand {
13516
+ /**
13517
+ * Label of the button
13518
+ */
13519
+ label?: string;
13520
+ /**
13521
+ * Text to be displayed as a tooltip on hover
13522
+ */
13523
+ tip?: string;
13524
+ /**
13525
+ * HTML formatted text to be displayed within a tooltip on hover
13526
+ */
13527
+ htmlTip?: string;
13528
+ /**
13529
+ * Icon of the button
13530
+ */
13531
+ icon?: string;
13532
+ /**
13533
+ * Keycode of a key to be used together with the <ctrl> key for use as a shortcut to trigger this element
13534
+ */
13535
+ key?: number;
13536
+ /**
13537
+ * Either this or "cmd" is required. Function for when button gets clicked/tapped.
13538
+ */
13539
+ handler?: () => void;
13540
+ /**
13541
+ * Either this or "handler" is required. This must be a valid execCommand method according to the designMode API.
13542
+ */
13543
+ cmd?: string;
13544
+ /**
13545
+ * Only set a param if using a "cmd". This is commonly text or HTML to inject, but is highly dependent upon the specific cmd being called.
13546
+ */
13547
+ param?: string;
13548
+ /**
13549
+ * Is button disabled?
13550
+ * @returns If true, the button will be disabled
13551
+ */
13552
+ disable?: boolean | (() => boolean);
13553
+ /**
13554
+ * Pass the value "no-state" if the button should not have an "active" state
13555
+ */
13556
+ type?: "no-state";
13557
+ /**
13558
+ * Lock the button label, so it doesn't change based on the child option selected.
13559
+ */
13560
+ fixedLabel?: boolean;
13561
+ /**
13562
+ * Lock the button icon, so it doesn't change based on the child option selected.
13563
+ */
13564
+ fixedIcon?: boolean;
13565
+ /**
13566
+ * Highlight the toolbar button, when a child option has been selected.
13567
+ */
13568
+ highlight?: boolean;
13569
+ }
13570
+
13472
13571
  import { VueStyleObjectProp } from "./api";
13473
13572
  import { ValidationRule } from "./api";
13474
13573
  import { QRejectedEntry } from "./api";
@@ -13563,7 +13662,14 @@ declare module "./globals" {
13563
13662
  * @returns Chainable Object
13564
13663
  */
13565
13664
  dialog: (opts: QDialogOptions) => DialogChainObject;
13566
- loading: Loading;
13665
+ /**
13666
+ * Activate and show
13667
+ * @param opts All props are optional
13668
+ * @returns Calling this function with no parameters hides the group; When called with one Object parameter then it updates the Loading group (specified properties are shallow merged with the group ones; note that group cannot be changed while updating and it is ignored)
13669
+ */
13670
+ loading: (
13671
+ opts?: QLoadingShowOptions
13672
+ ) => (props?: QLoadingUpdateOptions) => void;
13567
13673
  loadingBar: LoadingBar;
13568
13674
  localStorage: LocalStorage;
13569
13675
  /**
@@ -2,7 +2,7 @@
2
2
  "$schema": "",
3
3
  "framework": "vue",
4
4
  "name": "quasar",
5
- "version": "2.7.7",
5
+ "version": "2.8.1",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
@@ -1128,6 +1128,11 @@
1128
1128
  "name": "label",
1129
1129
  "description": "Customize main button's content through this slot, unless you're using the 'icon' and 'label' props",
1130
1130
  "doc-url": "https://v2.quasar.dev/vue-components/button-dropdown"
1131
+ },
1132
+ {
1133
+ "name": "loading",
1134
+ "description": "Override the default QSpinner when in 'loading' state",
1135
+ "doc-url": "https://v2.quasar.dev/vue-components/button-dropdown"
1131
1136
  }
1132
1137
  ],
1133
1138
  "description": "QBtnDropdown - Quasar component",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar",
3
- "version": "2.7.7",
3
+ "version": "2.8.1",
4
4
  "description": "Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time",
5
5
  "main": "dist/quasar.cjs.prod.js",
6
6
  "module": "dist/quasar.esm.prod.js",
@@ -17,8 +17,8 @@ export default createComponent({
17
17
  },
18
18
 
19
19
  setup (props, { slots }) {
20
- const vm = getCurrentInstance()
21
- const isDark = useDark(props, vm.proxy.$q)
20
+ const { proxy: { $q } } = getCurrentInstance()
21
+ const isDark = useDark(props, $q)
22
22
 
23
23
  const classes = computed(() =>
24
24
  'q-banner row items-center'
@@ -14,8 +14,8 @@ export default createComponent({
14
14
  },
15
15
 
16
16
  setup (props, { slots }) {
17
- const vm = getCurrentInstance()
18
- const isDark = useDark(props, vm.proxy.$q)
17
+ const { proxy: { $q } } = getCurrentInstance()
18
+ const isDark = useDark(props, $q)
19
19
 
20
20
  const classes = computed(() =>
21
21
  'q-bar row no-wrap items-center'
@@ -173,7 +173,10 @@ export default createComponent({
173
173
  round: false,
174
174
  ...attributes.value,
175
175
  onClick
176
- }, () => hSlot(slots.label, []).concat(Arrow))
176
+ }, {
177
+ default: () => hSlot(slots.label, []).concat(Arrow),
178
+ loading: slots.loading
179
+ })
177
180
  }
178
181
 
179
182
  return h(QBtnGroup, {
@@ -195,7 +198,10 @@ export default createComponent({
195
198
  iconRight: props.iconRight,
196
199
  round: false,
197
200
  onClick: onClickHide
198
- }, slots.label),
201
+ }, {
202
+ default: slots.label,
203
+ loading: slots.loading
204
+ }),
199
205
 
200
206
  h(QBtn, {
201
207
  class: 'q-btn-dropdown__arrow-container q-anchor--skip',
@@ -129,6 +129,11 @@
129
129
 
130
130
  "label": {
131
131
  "desc": "Customize main button's content through this slot, unless you're using the 'icon' and 'label' props"
132
+ },
133
+
134
+ "loading": {
135
+ "desc": "Override the default QSpinner when in 'loading' state",
136
+ "addedIn": "v2.8"
132
137
  }
133
138
  },
134
139
 
@@ -22,8 +22,8 @@ export default createComponent({
22
22
  },
23
23
 
24
24
  setup (props, { slots }) {
25
- const vm = getCurrentInstance()
26
- const isDark = useDark(props, vm.proxy.$q)
25
+ const { proxy: { $q } } = getCurrentInstance()
26
+ const isDark = useDark(props, $q)
27
27
 
28
28
  const classes = computed(() =>
29
29
  'q-card'
@@ -7,7 +7,7 @@ import usePanel, { usePanelProps, usePanelEmits } from '../../composables/privat
7
7
  import useFullscreen, { useFullscreenProps, useFullscreenEmits } from '../../composables/private/use-fullscreen.js'
8
8
 
9
9
  import { createComponent } from '../../utils/private/create.js'
10
- import { isNumber } from '../../utils/private/is.js'
10
+ import { isNumber } from '../../utils/is.js'
11
11
  import { hMergeSlot, hDir } from '../../utils/private/render.js'
12
12
 
13
13
  const navigationPositionOptions = [ 'top', 'right', 'bottom', 'left' ]
@@ -12,7 +12,7 @@ import { hSlot } from '../../utils/private/render.js'
12
12
  import { formatDate, __splitDate, getDateDiff } from '../../utils/date.js'
13
13
  import { pad } from '../../utils/format.js'
14
14
  import { jalaaliMonthLength, toGregorian } from '../../utils/private/date-persian.js'
15
- import { isObject } from '../../utils/private/is.js'
15
+ import { isObject } from '../../utils/is.js'
16
16
 
17
17
  const yearsInterval = 20
18
18
  const views = [ 'Calendar', 'Years', 'Months' ]
@@ -1065,11 +1065,6 @@ export default createComponent({
1065
1065
  emit('update:modelValue', (props.multiple === true ? model : model[ 0 ]) || null, reason)
1066
1066
  }
1067
1067
 
1068
- // expose public methods
1069
- Object.assign(proxy, {
1070
- setToday, setView, offsetCalendar, setCalendarTo, setEditingRange
1071
- })
1072
-
1073
1068
  function getHeader () {
1074
1069
  if (props.minimal === true) { return }
1075
1070
 
@@ -1427,6 +1422,11 @@ export default createComponent({
1427
1422
  }
1428
1423
  }
1429
1424
 
1425
+ // expose public methods
1426
+ Object.assign(proxy, {
1427
+ setToday, setView, offsetCalendar, setCalendarTo, setEditingRange
1428
+ })
1429
+
1430
1430
  return () => {
1431
1431
  const content = [
1432
1432
  h('div', {
@@ -17,7 +17,7 @@ import { createComponent } from '../../utils/private/create.js'
17
17
  import useDark, { useDarkProps } from '../../composables/private/use-dark.js'
18
18
 
19
19
  import { isKeyCode } from '../../utils/private/key-composition.js'
20
- import { isObject } from '../../utils/private/is.js'
20
+ import { isObject } from '../../utils/is.js'
21
21
 
22
22
  export default createComponent({
23
23
  name: 'DialogPlugin',
@@ -453,11 +453,6 @@ export default createComponent({
453
453
  return contentRef.value
454
454
  }
455
455
 
456
- // expose public methods
457
- Object.assign(proxy, {
458
- runCmd, refreshToolbar, focus, getContentEl
459
- })
460
-
461
456
  onMounted(() => {
462
457
  eVm.caret = proxy.caret = new Caret(contentRef.value, eVm)
463
458
  setContent(props.modelValue)
@@ -470,6 +465,11 @@ export default createComponent({
470
465
  document.removeEventListener('selectionchange', onSelectionchange)
471
466
  })
472
467
 
468
+ // expose public methods
469
+ Object.assign(proxy, {
470
+ runCmd, refreshToolbar, focus, getContentEl
471
+ })
472
+
473
473
  return () => {
474
474
  let toolbars
475
475