@lavalogic/scoria 0.40.31 → 0.40.33

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 (137) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +28 -28
  3. package/dist/Components/AccordionGroupButton.svelte +60 -60
  4. package/dist/Components/Action.svelte +48 -48
  5. package/dist/Components/AlertModal.svelte +102 -102
  6. package/dist/Components/Base/ContextWrapper.svelte +45 -45
  7. package/dist/Components/Base/Pagination.svelte +135 -135
  8. package/dist/Components/Base/Snippets.svelte +25 -25
  9. package/dist/Components/BigRadioSet.svelte +34 -34
  10. package/dist/Components/Bubble.svelte +38 -38
  11. package/dist/Components/Button.svelte +83 -83
  12. package/dist/Components/Checkbox.svelte +71 -71
  13. package/dist/Components/CollapsibleCard.svelte +59 -59
  14. package/dist/Components/CollapsibleMenuGroup.svelte +43 -43
  15. package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +101 -101
  16. package/dist/Components/Contexts/ContextMenu.svelte +76 -76
  17. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  18. package/dist/Components/Contexts/ContextMenuOption.svelte +38 -38
  19. package/dist/Components/Contexts/Toast.svelte +71 -71
  20. package/dist/Components/Contexts/ToastContainer.svelte +34 -34
  21. package/dist/Components/Contexts/Tooltip.svelte +32 -32
  22. package/dist/Components/DataMatrixIcon.svelte +37 -37
  23. package/dist/Components/DateInput.svelte +80 -80
  24. package/dist/Components/DatePicker.svelte +86 -86
  25. package/dist/Components/DesktopModal.svelte +65 -65
  26. package/dist/Components/Dial.svelte +35 -35
  27. package/dist/Components/DimensionInput.svelte +95 -95
  28. package/dist/Components/DragMenu/DragMenuHolder.svelte +53 -53
  29. package/dist/Components/DragMenu/DraggableCard.svelte +49 -49
  30. package/dist/Components/FileCard.svelte +18 -18
  31. package/dist/Components/FileUpload.svelte +115 -115
  32. package/dist/Components/GridInput.svelte +123 -123
  33. package/dist/Components/GridInputSet.svelte +21 -21
  34. package/dist/Components/HorizontalTabGroup.svelte +54 -54
  35. package/dist/Components/HorizontalTabGroupButton.svelte +32 -32
  36. package/dist/Components/Icon.svelte +68 -68
  37. package/dist/Components/Icons.d.ts +3 -3
  38. package/dist/Components/Icons.js +11 -11
  39. package/dist/Components/InfoAlert.svelte +32 -32
  40. package/dist/Components/LoadingAnimation.svelte +228 -227
  41. package/dist/Components/LoadingModal.svelte +19 -19
  42. package/dist/Components/LoadingOverlay.svelte +20 -20
  43. package/dist/Components/Modal.svelte +127 -127
  44. package/dist/Components/MultiSelect.svelte +126 -126
  45. package/dist/Components/Nav/Nav.svelte +71 -71
  46. package/dist/Components/Nav/NavServiceMenuList.svelte +37 -37
  47. package/dist/Components/Nav/NavTab.svelte +46 -46
  48. package/dist/Components/Nav/ServiceMenuItem.svelte +62 -62
  49. package/dist/Components/Nav/ServicesNav.svelte +50 -50
  50. package/dist/Components/NumberInput.svelte +98 -98
  51. package/dist/Components/OptionCards.svelte +58 -58
  52. package/dist/Components/PageHeading.svelte +21 -21
  53. package/dist/Components/PasswordInput.svelte +61 -61
  54. package/dist/Components/PopoverButton.svelte +53 -53
  55. package/dist/Components/Portal.svelte +7 -7
  56. package/dist/Components/ProgressBubble.svelte +42 -42
  57. package/dist/Components/QuerySelect.svelte +102 -102
  58. package/dist/Components/ResourceCalendar/ResourceCalendar.svelte +241 -241
  59. package/dist/Components/SidebarPanel.svelte +32 -32
  60. package/dist/Components/SingleSelect.svelte +122 -122
  61. package/dist/Components/StepButton.svelte +48 -48
  62. package/dist/Components/StepForm.svelte +58 -58
  63. package/dist/Components/Switch.svelte +43 -43
  64. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  65. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +30 -30
  66. package/dist/Components/Table/Body/Rows/ColumnList.svelte +24 -24
  67. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +165 -165
  68. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +13 -13
  69. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +120 -120
  70. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +81 -81
  71. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +92 -92
  72. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +110 -110
  73. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +54 -54
  74. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +35 -35
  75. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +64 -64
  76. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +82 -82
  77. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +88 -88
  78. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +90 -90
  79. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +96 -96
  80. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +71 -71
  81. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +124 -124
  82. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +91 -91
  83. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +88 -88
  84. package/dist/Components/Table/Body/Rows/TableRow.svelte +127 -127
  85. package/dist/Components/Table/Body/TableBody.svelte +92 -92
  86. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +25 -25
  87. package/dist/Components/Table/Headers/SelectAllHeader.svelte +20 -20
  88. package/dist/Components/Table/Headers/TableHead.svelte +175 -175
  89. package/dist/Components/Table/Misc/ColumnPanel.svelte +32 -32
  90. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +29 -29
  91. package/dist/Components/Table/Misc/FilterInput.svelte +326 -326
  92. package/dist/Components/Table/Misc/FilterPanel.svelte +79 -79
  93. package/dist/Components/Table/Misc/FilterPanelModal.svelte +21 -21
  94. package/dist/Components/Table/Misc/ShareViewModal.svelte +118 -118
  95. package/dist/Components/Table/Misc/SidePanel.svelte +24 -24
  96. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +318 -318
  97. package/dist/Components/Table/Misc/TableFooter.svelte +201 -201
  98. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +112 -112
  99. package/dist/Components/Table/Misc/TableSidebar.svelte +116 -116
  100. package/dist/Components/Table/Misc/TableViewDropdown.svelte +25 -25
  101. package/dist/Components/Table/Misc/ToolboxPanel.svelte +60 -60
  102. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +63 -63
  103. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +101 -101
  104. package/dist/Components/Table/NestedTable.svelte +29 -29
  105. package/dist/Components/Table/Table.svelte +140 -140
  106. package/dist/Components/Test/TestContextConsumer.svelte +8 -8
  107. package/dist/Components/TextArea.svelte +92 -90
  108. package/dist/Components/TextInput.svelte +128 -117
  109. package/dist/Components/ThreeStateRadio.svelte +101 -101
  110. package/dist/Components/Touch/BoolCard.svelte +27 -27
  111. package/dist/Components/Touch/DateModal.svelte +98 -98
  112. package/dist/Components/Touch/EditCard.svelte +44 -44
  113. package/dist/Components/Touch/InfoCard.svelte +25 -25
  114. package/dist/Components/Touch/InfoTextCard.svelte +22 -22
  115. package/dist/Components/Touch/ModalExplanation.svelte +13 -13
  116. package/dist/Components/Touch/NumberKeyboard.svelte +81 -81
  117. package/dist/Components/Touch/NumberModal.svelte +49 -49
  118. package/dist/Components/Touch/PlusMinusCard.svelte +40 -40
  119. package/dist/Components/Touch/SelectModal.svelte +86 -86
  120. package/dist/Components/Touch/SummaryCard.svelte +74 -74
  121. package/dist/Components/Touch/TextAreaModal.svelte +53 -53
  122. package/dist/Components/Touch/TextModal.svelte +56 -56
  123. package/dist/Components/Touch/TouchCard.svelte +28 -28
  124. package/dist/Components/Touch/TouchModal.svelte +141 -141
  125. package/dist/Components/Touch/UtilityButton.svelte +63 -63
  126. package/dist/Components/VerticalTabGroup.svelte +38 -38
  127. package/dist/Components/VerticalTabGroupButton.svelte +46 -46
  128. package/dist/Helpers/Datamatrix.d.ts +19 -19
  129. package/dist/Helpers/Datamatrix.js +291 -291
  130. package/dist/Types/Examples/ExampleModal.svelte +27 -27
  131. package/dist/paraglide/README.md +1 -1
  132. package/dist/scss/_basics.scss +12 -12
  133. package/dist/scss/_colours.scss +140 -140
  134. package/dist/scss/_motion.scss +57 -57
  135. package/dist/scss/_sizing.scss +85 -85
  136. package/dist/scss/_transitions.scss +8 -8
  137. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="T extends object, IdType extends Primitive"
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="T extends object, IdType extends Primitive"
6
6
  >import DesktopModal from "../../DesktopModal.svelte";
7
7
  import Icon from "../../Icon.svelte";
8
8
  import InfoAlert from "../../InfoAlert.svelte";
@@ -76,101 +76,101 @@ async function save() {
76
76
  saving = false;
77
77
  }
78
78
  }
79
- </script>
80
-
81
- <DesktopModal
82
- headerLabel={i18n['scoria.label.update_options_header']({ name: view.name })}
83
- headerSubtitle={view.kind === 'filter'
84
- ? i18n['scoria.text.update_filter_subtitle']()
85
- : i18n['scoria.text.update_layout_subtitle']()}
86
- onclose={() => {
87
- if (!saving) {
88
- onclose();
89
- }
90
- }}
91
- width={cssLength('40vw')}
92
- minWidth={cssLength('32rem')}
93
- buttons={[
94
- {
95
- label: i18n['scoria.action.cancel'](),
96
- callback: () => {
97
- if (!saving) {
98
- onclose();
99
- }
100
- },
101
- disabled: saving,
102
- },
103
- {
104
- label: saving ? i18n['scoria.action.saving']() : i18n['scoria.action.save'](),
105
- callback: () => {
106
- void save();
107
- },
108
- colourSet: ColourSet.Primary,
109
- disabled: saving || !dirty || !isValidName,
110
- },
111
- ]}
112
- >
113
- <div class="options-body">
114
- {#if errorMessage}
115
- <div
116
- class="error-banner"
117
- role="alert"
118
- >
119
- <Icon
120
- name="circle-exclamation"
121
- size={Size.Small}
122
- />
123
- <span>{errorMessage}</span>
124
- </div>
125
- {/if}
126
-
127
- <InfoAlert>
128
- {view.kind === 'filter'
129
- ? i18n['scoria.text.changes_apply_filter']()
130
- : i18n['scoria.text.changes_apply_layout']()}
131
- </InfoAlert>
132
-
133
- <div class="field">
134
- <label
135
- class="field-label"
136
- for="update-view-name">{i18n['scoria.label.name']()}</label
137
- >
138
- <TextInput
139
- id="update-view-name"
140
- bind:value={name}
141
- placeholder={view.kind === 'filter'
142
- ? i18n['scoria.label.filter_name_placeholder']()
143
- : i18n['scoria.label.layout_name_placeholder']()}
144
- required
145
- invalid={!isValidName}
146
- />
147
- </div>
148
-
149
- <div class="field">
150
- <label
151
- class="field-label"
152
- for="update-view-visibility">{i18n['scoria.label.visibility']()}</label
153
- >
154
- <SingleSelect
155
- inputId="update-view-visibility"
156
- name="Visibility"
157
- placeholder={i18n['scoria.label.select_visibility']()}
158
- options={visibilityOptions}
159
- labelProp="label"
160
- valueProp="value"
161
- value={selectedVisibility}
162
- valueAsObject
163
- searchable={false}
164
- onchange={(option: SelectOption<DatatableViewVisibility> | null) => {
165
- if (option) {
166
- visibility = option.value;
167
- }
168
- }}
169
- />
170
- </div>
171
- </div>
172
- </DesktopModal>
173
-
79
+ </script>
80
+
81
+ <DesktopModal
82
+ headerLabel={i18n['scoria.label.update_options_header']({ name: view.name })}
83
+ headerSubtitle={view.kind === 'filter'
84
+ ? i18n['scoria.text.update_filter_subtitle']()
85
+ : i18n['scoria.text.update_layout_subtitle']()}
86
+ onclose={() => {
87
+ if (!saving) {
88
+ onclose();
89
+ }
90
+ }}
91
+ width={cssLength('40vw')}
92
+ minWidth={cssLength('32rem')}
93
+ buttons={[
94
+ {
95
+ label: i18n['scoria.action.cancel'](),
96
+ callback: () => {
97
+ if (!saving) {
98
+ onclose();
99
+ }
100
+ },
101
+ disabled: saving,
102
+ },
103
+ {
104
+ label: saving ? i18n['scoria.action.saving']() : i18n['scoria.action.save'](),
105
+ callback: () => {
106
+ void save();
107
+ },
108
+ colourSet: ColourSet.Primary,
109
+ disabled: saving || !dirty || !isValidName,
110
+ },
111
+ ]}
112
+ >
113
+ <div class="options-body">
114
+ {#if errorMessage}
115
+ <div
116
+ class="error-banner"
117
+ role="alert"
118
+ >
119
+ <Icon
120
+ name="circle-exclamation"
121
+ size={Size.Small}
122
+ />
123
+ <span>{errorMessage}</span>
124
+ </div>
125
+ {/if}
126
+
127
+ <InfoAlert>
128
+ {view.kind === 'filter'
129
+ ? i18n['scoria.text.changes_apply_filter']()
130
+ : i18n['scoria.text.changes_apply_layout']()}
131
+ </InfoAlert>
132
+
133
+ <div class="field">
134
+ <label
135
+ class="field-label"
136
+ for="update-view-name">{i18n['scoria.label.name']()}</label
137
+ >
138
+ <TextInput
139
+ id="update-view-name"
140
+ bind:value={name}
141
+ placeholder={view.kind === 'filter'
142
+ ? i18n['scoria.label.filter_name_placeholder']()
143
+ : i18n['scoria.label.layout_name_placeholder']()}
144
+ required
145
+ invalid={!isValidName}
146
+ />
147
+ </div>
148
+
149
+ <div class="field">
150
+ <label
151
+ class="field-label"
152
+ for="update-view-visibility">{i18n['scoria.label.visibility']()}</label
153
+ >
154
+ <SingleSelect
155
+ inputId="update-view-visibility"
156
+ name="Visibility"
157
+ placeholder={i18n['scoria.label.select_visibility']()}
158
+ options={visibilityOptions}
159
+ labelProp="label"
160
+ valueProp="value"
161
+ value={selectedVisibility}
162
+ valueAsObject
163
+ searchable={false}
164
+ onchange={(option: SelectOption<DatatableViewVisibility> | null) => {
165
+ if (option) {
166
+ visibility = option.value;
167
+ }
168
+ }}
169
+ />
170
+ </div>
171
+ </div>
172
+ </DesktopModal>
173
+
174
174
  <style>.options-body {
175
175
  display: flex;
176
176
  flex-flow: column nowrap;
@@ -204,4 +204,4 @@ async function save() {
204
204
  font-size: 1.125rem;
205
205
  font-weight: 600;
206
206
  color: #3a4952;
207
- }</style>
207
+ }</style>
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
6
  >import Table from "./Table.svelte";
7
7
  import { TableContext } from "./Types/Context/TableContext.svelte.js";
8
8
  import { LocalTableDataRepository } from "./Types/DataRepository/LocalTableDataRepository.svelte.js";
@@ -31,11 +31,11 @@ const DEFAULT_NESTED_TABLE_OPTIONS = Object.freeze({
31
31
  toolbar: ToolbarPosition.None,
32
32
  displayFooter: false
33
33
  });
34
- </script>
35
-
36
- <script
37
- lang="ts"
38
- generics="T extends object,IdType extends Primitive"
34
+ </script>
35
+
36
+ <script
37
+ lang="ts"
38
+ generics="T extends object,IdType extends Primitive"
39
39
  >const { tableName, data, columnDefWrapper, options, oncontextmenu, getUserId } = $props();
40
40
  // Reactive wrapper exposing the `data` prop as `.value` so the
41
41
  // underlying LocalTableDataRepository can read it through its
@@ -87,24 +87,24 @@ const tableContext = TableContext.init(columnDefWrapper, tableName, dataRepo, {
87
87
  ...options,
88
88
  getUserId: () => getUserId()
89
89
  });
90
- </script>
91
-
92
- <!-- svelte-ignore a11y_no_static_element_interactions -->
93
- <div
94
- class="limit-height"
95
- bind:this={root}
96
- style:width={maxWidth != null ? `${maxWidth}px` : null}
97
- oncontextmenu={(e) => {
98
- e.stopPropagation();
99
- oncontextmenu?.(e);
100
- }}
101
- >
102
- <Table
103
- nested
104
- {tableContext}
105
- />
106
- </div>
107
-
90
+ </script>
91
+
92
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
93
+ <div
94
+ class="limit-height"
95
+ bind:this={root}
96
+ style:width={maxWidth != null ? `${maxWidth}px` : null}
97
+ oncontextmenu={(e) => {
98
+ e.stopPropagation();
99
+ oncontextmenu?.(e);
100
+ }}
101
+ >
102
+ <Table
103
+ nested
104
+ {tableContext}
105
+ />
106
+ </div>
107
+
108
108
  <style>.limit-height {
109
109
  position: sticky;
110
110
  left: 0;
@@ -113,4 +113,4 @@ const tableContext = TableContext.init(columnDefWrapper, tableName, dataRepo, {
113
113
  box-sizing: border-box;
114
114
  background-color: #f4f7f9;
115
115
  box-shadow: inset 0px 7px 5px -6px #cbd4da, inset 0px -7px 5px -6px #cbd4da;
116
- }</style>
116
+ }</style>
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
6
  >import { m as i18n } from "../../paraglide/messages.js";
7
7
  import { ContextMenuContext } from "../../Contexts/ContextMenuContext.svelte";
8
8
  import { cssLength, devCatch, refWrapper } from "../../Helpers/Helpers.svelte";
@@ -24,11 +24,11 @@ import { ToolbarPosition } from "./Types/Toolbar/ToolbarPosition.js";
24
24
  */
25
25
  export const quickFilterContextIdentifier = Symbol();
26
26
  const openedQuickFilterSelect = refWrapper(null);
27
- </script>
28
-
29
- <script
30
- lang="ts"
31
- generics="T extends object,IdType extends Primitive"
27
+ </script>
28
+
29
+ <script
30
+ lang="ts"
31
+ generics="T extends object,IdType extends Primitive"
32
32
  >const { nested = false, table, tableContext: tableContextProp } = $props();
33
33
  // Resolve the underlying TableContext from whichever prop was passed:
34
34
  // consumers pass `table`; internal `NestedTable` passes `tableContext`
@@ -429,135 +429,135 @@ $effect(() => {
429
429
  stickyRo?.disconnect();
430
430
  };
431
431
  });
432
- </script>
433
-
434
- <svelte:window
435
- onmouseup={(e: MouseEvent) => {
436
- if (
437
- // if it's not a click on an item in the context menu
438
- !(e.target as HTMLElement | undefined)?.classList.contains('context-menu-item') &&
439
- // if it's outside the table or inside the empty space of the table
440
- (e.target === unfocusRef ||
441
- ((e.target as HTMLElement | undefined)?.closest('.table-wrapper') == null &&
442
- mousedDownEmptySpace))
443
- ) {
444
- tableContext.unfocus();
445
- }
446
- mousedDownEmptySpace = false;
447
-
448
- if (tableContext.isMousingDown) {
449
- tableContext.isMousingDown = false;
450
- }
451
-
452
- removeOverrideResizeHandler();
453
- }}
454
- onclick={(e: MouseEvent) => {
455
- handleClickOutside(e);
456
- }}
457
- onmousedown={(e: MouseEvent) => {
458
- mousedDownEmptySpace =
459
- e.target === unfocusRef || (e.target as HTMLElement).closest('.table-wrapper') == null;
460
- }}
461
- />
462
-
463
- <div
464
- class="grid"
465
- class:nested
466
- style="--show-top-shadow: {hasScrolledPastHeader
467
- ? 1
468
- : 0}; --show-bottom-shadow: {hasContentBelowFooter ? 1 : 0};"
469
- >
470
- {#if tableContext.dataRepo.isLoading}
471
- <LoadingOverlay
472
- absolute
473
- borderRadius={cssLength('4px')}
474
- message={tableContext.dataRepo.loadingMessage}
475
- />
476
- {/if}
477
-
478
- <div
479
- class="horizontal-bar"
480
- class:border={tableContext.toolbarPosition === ToolbarPosition.Top}
481
- >
482
- {#if tableContext.toolbarPosition === ToolbarPosition.Top}
483
- <TableHorizontalBar />
484
- {/if}
485
- </div>
486
-
487
- <div
488
- class="sidebar-wrapper sidebar-wrapper-left"
489
- class:nested
490
- style="--nested-height: {nestedHeight}px;"
491
- >
492
- {#if tableContext.toolbarPosition === ToolbarPosition.Left}
493
- <div class="sidebar toolbar-left">
494
- <TableSidebar />
495
- </div>
496
- {/if}
497
- </div>
498
- <div
499
- class="sidebar-wrapper sidebar-wrapper-right"
500
- class:nested
501
- style="--nested-height: {nestedHeight}px;"
502
- >
503
- {#if tableContext.toolbarPosition === ToolbarPosition.Right}
504
- <div class="sidebar toolbar-right">
505
- <TableSidebar />
506
- </div>
507
- {/if}
508
- </div>
509
-
510
- <div class="footer">
511
- {#if tableContext.displayFooter}
512
- <TableFooter />
513
- {/if}
514
- </div>
515
-
516
- <!-- svelte-ignore a11y_no_static_element_interactions -->
517
- <div
518
- bind:this={tableRef}
519
- class="datatable"
520
- class:nested
521
- class:compact={tableContext.isCompact}
522
- class:quick-filtering={tableContext.showQuickFiltering}
523
- onkeydown={tableContext.handleTdKeydown}
524
- style="--pinned-start: {totalPinnedLeftWidth}px; --pinned-end: {totalPinnedRightWidth}px; --sticky-top-height: {stickyTopHeight}px;"
525
- >
526
- <div
527
- class="flex_table"
528
- bind:this={ref}
529
- class:nested
530
- >
531
- <div
532
- bind:this={unfocusRef}
533
- class="table-wrapper"
534
- oncontextmenu={openContextMenu}
535
- >
536
- <div
537
- role="table"
538
- class="datatable-grid"
539
- style="--cols: {colsTemplate};"
540
- >
541
- <TableHead />
542
- <TableBody />
543
- </div>
544
- </div>
545
- </div>
546
-
547
- {#if nested}
548
- <!-- svelte-ignore a11y_no_static_element_interactions -->
549
- <div
550
- class:isResizing
551
- class="resizer"
552
- onmousedown={(e) => {
553
- e.preventDefault();
554
- addOverrideResizeHandler();
555
- }}
556
- ></div>
557
- {/if}
558
- </div>
559
- </div>
560
-
432
+ </script>
433
+
434
+ <svelte:window
435
+ onmouseup={(e: MouseEvent) => {
436
+ if (
437
+ // if it's not a click on an item in the context menu
438
+ !(e.target as HTMLElement | undefined)?.classList.contains('context-menu-item') &&
439
+ // if it's outside the table or inside the empty space of the table
440
+ (e.target === unfocusRef ||
441
+ ((e.target as HTMLElement | undefined)?.closest('.table-wrapper') == null &&
442
+ mousedDownEmptySpace))
443
+ ) {
444
+ tableContext.unfocus();
445
+ }
446
+ mousedDownEmptySpace = false;
447
+
448
+ if (tableContext.isMousingDown) {
449
+ tableContext.isMousingDown = false;
450
+ }
451
+
452
+ removeOverrideResizeHandler();
453
+ }}
454
+ onclick={(e: MouseEvent) => {
455
+ handleClickOutside(e);
456
+ }}
457
+ onmousedown={(e: MouseEvent) => {
458
+ mousedDownEmptySpace =
459
+ e.target === unfocusRef || (e.target as HTMLElement).closest('.table-wrapper') == null;
460
+ }}
461
+ />
462
+
463
+ <div
464
+ class="grid"
465
+ class:nested
466
+ style="--show-top-shadow: {hasScrolledPastHeader
467
+ ? 1
468
+ : 0}; --show-bottom-shadow: {hasContentBelowFooter ? 1 : 0};"
469
+ >
470
+ {#if tableContext.dataRepo.isLoading}
471
+ <LoadingOverlay
472
+ absolute
473
+ borderRadius={cssLength('4px')}
474
+ message={tableContext.dataRepo.loadingMessage}
475
+ />
476
+ {/if}
477
+
478
+ <div
479
+ class="horizontal-bar"
480
+ class:border={tableContext.toolbarPosition === ToolbarPosition.Top}
481
+ >
482
+ {#if tableContext.toolbarPosition === ToolbarPosition.Top}
483
+ <TableHorizontalBar />
484
+ {/if}
485
+ </div>
486
+
487
+ <div
488
+ class="sidebar-wrapper sidebar-wrapper-left"
489
+ class:nested
490
+ style="--nested-height: {nestedHeight}px;"
491
+ >
492
+ {#if tableContext.toolbarPosition === ToolbarPosition.Left}
493
+ <div class="sidebar toolbar-left">
494
+ <TableSidebar />
495
+ </div>
496
+ {/if}
497
+ </div>
498
+ <div
499
+ class="sidebar-wrapper sidebar-wrapper-right"
500
+ class:nested
501
+ style="--nested-height: {nestedHeight}px;"
502
+ >
503
+ {#if tableContext.toolbarPosition === ToolbarPosition.Right}
504
+ <div class="sidebar toolbar-right">
505
+ <TableSidebar />
506
+ </div>
507
+ {/if}
508
+ </div>
509
+
510
+ <div class="footer">
511
+ {#if tableContext.displayFooter}
512
+ <TableFooter />
513
+ {/if}
514
+ </div>
515
+
516
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
517
+ <div
518
+ bind:this={tableRef}
519
+ class="datatable"
520
+ class:nested
521
+ class:compact={tableContext.isCompact}
522
+ class:quick-filtering={tableContext.showQuickFiltering}
523
+ onkeydown={tableContext.handleTdKeydown}
524
+ style="--pinned-start: {totalPinnedLeftWidth}px; --pinned-end: {totalPinnedRightWidth}px; --sticky-top-height: {stickyTopHeight}px;"
525
+ >
526
+ <div
527
+ class="flex_table"
528
+ bind:this={ref}
529
+ class:nested
530
+ >
531
+ <div
532
+ bind:this={unfocusRef}
533
+ class="table-wrapper"
534
+ oncontextmenu={openContextMenu}
535
+ >
536
+ <div
537
+ role="table"
538
+ class="datatable-grid"
539
+ style="--cols: {colsTemplate};"
540
+ >
541
+ <TableHead />
542
+ <TableBody />
543
+ </div>
544
+ </div>
545
+ </div>
546
+
547
+ {#if nested}
548
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
549
+ <div
550
+ class:isResizing
551
+ class="resizer"
552
+ onmousedown={(e) => {
553
+ e.preventDefault();
554
+ addOverrideResizeHandler();
555
+ }}
556
+ ></div>
557
+ {/if}
558
+ </div>
559
+ </div>
560
+
561
561
  <style>div.grid {
562
562
  border-radius: 4px;
563
563
  display: grid;
@@ -709,4 +709,4 @@ div.sidebar-wrapper .sidebar.toolbar-right {
709
709
  text-align: start;
710
710
  min-width: max-content;
711
711
  isolation: isolate;
712
- }</style>
712
+ }</style>
@@ -1,11 +1,11 @@
1
- <svelte:options runes />
2
-
1
+ <svelte:options runes />
2
+
3
3
  <script lang="ts">import { TestContext } from "../../Contexts/TestContext.svelte.js";
4
4
  import { getContext } from "svelte";
5
5
  const testContext = getContext(TestContext.identifier);
6
- </script>
7
-
8
- <h1>counter 1: {testContext.value1.value}</h1>
9
- <p>Ref wrapper 1 is incremented every time you click the button</p>
10
- <h2>counter 2: {testContext.value2.value}</h2>
11
- <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>
6
+ </script>
7
+
8
+ <h1>counter 1: {testContext.value1.value}</h1>
9
+ <p>Ref wrapper 1 is incremented every time you click the button</p>
10
+ <h2>counter 2: {testContext.value2.value}</h2>
11
+ <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>