@ac-design/design-system 1.0.3 → 2.0.0
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/README.md +27 -18
- package/dist/lib/charts/ChartFrame.js +5 -0
- package/dist/lib/charts/ChartFrame.vue.d.ts +69 -0
- package/dist/lib/charts/ChartFrame.vue_vue_type_script_setup_true_lang.js +168 -0
- package/dist/lib/charts/index.d.ts +7 -0
- package/dist/lib/charts/index.js +5 -0
- package/dist/lib/charts/shared.d.ts +60 -0
- package/dist/lib/charts/shared.js +114 -0
- package/dist/lib/charts/xy.d.ts +65 -0
- package/dist/lib/charts/xy.js +92 -0
- package/dist/lib/compat.css +1707 -1042
- package/dist/lib/components/AcAccordion.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcAccordionItem.vue.d.ts +1 -1
- package/dist/lib/components/AcAccordionItem.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/lib/components/AcAlert.vue.d.ts +1 -1
- package/dist/lib/components/AcAlert.vue_vue_type_script_setup_true_lang.js +19 -25
- package/dist/lib/components/AcAppSwitcher.vue_vue_type_script_setup_true_lang.js +19 -19
- package/dist/lib/components/AcAreaChart.js +5 -0
- package/dist/lib/components/AcAreaChart.vue.d.ts +44 -0
- package/dist/lib/components/AcAreaChart.vue_vue_type_script_setup_true_lang.js +215 -0
- package/dist/lib/components/AcAvatar.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/lib/components/AcBadge.vue.d.ts +16 -7
- package/dist/lib/components/AcBadge.vue_vue_type_script_setup_true_lang.js +59 -43
- package/dist/lib/components/AcBanner.vue.d.ts +1 -1
- package/dist/lib/components/AcBanner.vue_vue_type_script_setup_true_lang.js +30 -30
- package/dist/lib/components/AcBarChart.js +5 -0
- package/dist/lib/components/AcBarChart.vue.d.ts +43 -0
- package/dist/lib/components/AcBarChart.vue_vue_type_script_setup_true_lang.js +217 -0
- package/dist/lib/components/AcBreadcrumb.vue_vue_type_script_setup_true_lang.js +27 -26
- package/dist/lib/components/AcBulkActionBar.js +5 -0
- package/dist/lib/components/AcBulkActionBar.vue.d.ts +43 -0
- package/dist/lib/components/AcBulkActionBar.vue_vue_type_script_setup_true_lang.js +84 -0
- package/dist/lib/components/AcButton.vue.d.ts +3 -3
- package/dist/lib/components/AcButton.vue_vue_type_script_setup_true_lang.js +42 -34
- package/dist/lib/components/AcButtons.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/lib/components/AcCard.vue.d.ts +10 -2
- package/dist/lib/components/AcCard.vue_vue_type_script_setup_true_lang.js +37 -11
- package/dist/lib/components/AcCellValue.vue.d.ts +4 -1
- package/dist/lib/components/AcCellValue.vue_vue_type_script_setup_true_lang.js +214 -179
- package/dist/lib/components/AcCheckBox.vue.d.ts +17 -3
- package/dist/lib/components/AcCheckBox.vue_vue_type_script_setup_true_lang.js +126 -29
- package/dist/lib/components/AcCheckRadio.vue.d.ts +1 -1
- package/dist/lib/components/AcCheckRadio.vue_vue_type_script_setup_true_lang.js +33 -21
- package/dist/lib/components/AcCircularProgress.js +5 -0
- package/dist/lib/components/AcCircularProgress.vue.d.ts +44 -0
- package/dist/lib/components/AcCircularProgress.vue_vue_type_script_setup_true_lang.js +111 -0
- package/dist/lib/components/AcClusterSwitcher.vue_vue_type_script_setup_true_lang.js +142 -167
- package/dist/lib/components/AcCodeEditor.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/lib/components/AcColorInput.js +5 -0
- package/dist/lib/components/AcColorInput.vue.d.ts +54 -0
- package/dist/lib/components/AcColorInput.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/lib/components/AcConfirmModal.js +5 -0
- package/dist/lib/components/AcConfirmModal.vue.d.ts +56 -0
- package/dist/lib/components/AcConfirmModal.vue_vue_type_script_setup_true_lang.js +92 -0
- package/dist/lib/components/AcContentHeader.vue.d.ts +1 -1
- package/dist/lib/components/AcContentHeader.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/lib/components/AcContentLayout.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcCopyButton.js +5 -0
- package/dist/lib/components/AcCopyButton.vue.d.ts +43 -0
- package/dist/lib/components/AcCopyButton.vue_vue_type_script_setup_true_lang.js +92 -0
- package/dist/lib/components/AcDatePicker.vue.d.ts +5 -5
- package/dist/lib/components/AcDatePicker.vue_vue_type_script_setup_true_lang.js +204 -213
- package/dist/lib/components/AcDeleteModal.vue.d.ts +4 -4
- package/dist/lib/components/AcDeleteModal.vue_vue_type_script_setup_true_lang.js +37 -46
- package/dist/lib/components/AcDonutChart.js +5 -0
- package/dist/lib/components/AcDonutChart.vue.d.ts +73 -0
- package/dist/lib/components/AcDonutChart.vue_vue_type_script_setup_true_lang.js +210 -0
- package/dist/lib/components/AcDropdown.vue.d.ts +1 -1
- package/dist/lib/components/AcDropdown.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/lib/components/AcDropdownDivider.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcDropdownItem.vue.d.ts +1 -1
- package/dist/lib/components/AcDropdownItem.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/lib/components/AcEmptyState.vue.d.ts +4 -1
- package/dist/lib/components/AcEmptyState.vue_vue_type_script_setup_true_lang.js +50 -39
- package/dist/lib/components/AcFeatureCard.vue_vue_type_script_setup_true_lang.js +14 -13
- package/dist/lib/components/AcFileEditor.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/lib/components/AcFileUpload.vue.d.ts +2 -2
- package/dist/lib/components/AcFileUpload.vue_vue_type_script_setup_true_lang.js +55 -53
- package/dist/lib/components/AcFontScale.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcFooter.js +5 -0
- package/dist/lib/components/AcFooter.vue.d.ts +37 -0
- package/dist/lib/components/AcFooter.vue_vue_type_script_setup_true_lang.js +107 -0
- package/dist/lib/components/AcForm.vue.d.ts +3 -0
- package/dist/lib/components/AcForm.vue_vue_type_script_setup_true_lang.js +4 -2
- package/dist/lib/components/AcFormArray.vue.d.ts +2 -2
- package/dist/lib/components/AcFormArray.vue_vue_type_script_setup_true_lang.js +149 -147
- package/dist/lib/components/AcFormFooter.vue.d.ts +2 -2
- package/dist/lib/components/AcFormFooter.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcFormSection.vue.d.ts +7 -0
- package/dist/lib/components/AcFormSection.vue_vue_type_script_setup_true_lang.js +31 -21
- package/dist/lib/components/AcHeader.vue.d.ts +3 -3
- package/dist/lib/components/AcHeader.vue_vue_type_script_setup_true_lang.js +22 -22
- package/dist/lib/components/AcInfoTable.vue_vue_type_script_setup_true_lang.js +17 -13
- package/dist/lib/components/AcInput.vue.d.ts +3 -3
- package/dist/lib/components/AcInput.vue_vue_type_script_setup_true_lang.js +98 -87
- package/dist/lib/components/AcKbd.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/lib/components/AcKeyValueInput.js +5 -0
- package/dist/lib/components/AcKeyValueInput.vue.d.ts +114 -0
- package/dist/lib/components/AcKeyValueInput.vue_vue_type_script_setup_true_lang.js +320 -0
- package/dist/lib/components/AcLineChart.js +5 -0
- package/dist/lib/components/AcLineChart.vue.d.ts +38 -0
- package/dist/lib/components/AcLineChart.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/lib/components/AcLocaleSwitcher.js +5 -0
- package/dist/lib/components/AcLocaleSwitcher.vue.d.ts +46 -0
- package/dist/lib/components/AcLocaleSwitcher.vue_vue_type_script_setup_true_lang.js +103 -0
- package/dist/lib/components/AcModal.vue_vue_type_script_setup_true_lang.js +23 -23
- package/dist/lib/components/AcNavbar.vue_vue_type_script_setup_true_lang.js +6 -6
- package/dist/lib/components/AcNavbarItem.vue.d.ts +1 -1
- package/dist/lib/components/AcNavbarItem.vue_vue_type_script_setup_true_lang.js +22 -22
- package/dist/lib/components/AcNotificationMenu.vue_vue_type_script_setup_true_lang.js +26 -26
- package/dist/lib/components/AcNumberInput.js +5 -0
- package/dist/lib/components/AcNumberInput.vue.d.ts +79 -0
- package/dist/lib/components/AcNumberInput.vue_vue_type_script_setup_true_lang.js +251 -0
- package/dist/lib/components/AcPage.vue.d.ts +2 -2
- package/dist/lib/components/AcPage.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/lib/components/AcPagination.vue.d.ts +20 -3
- package/dist/lib/components/AcPagination.vue_vue_type_script_setup_true_lang.js +81 -53
- package/dist/lib/components/AcPreloader.vue.d.ts +1 -1
- package/dist/lib/components/AcPreloader.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/lib/components/AcProgress.vue.d.ts +2 -2
- package/dist/lib/components/AcProgress.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/lib/components/AcResourceCard.vue.d.ts +2 -2
- package/dist/lib/components/AcResourceCard.vue_vue_type_script_setup_true_lang.js +13 -13
- package/dist/lib/components/AcSearchBar.vue.d.ts +1 -1
- package/dist/lib/components/AcSearchBar.vue_vue_type_script_setup_true_lang.js +9 -8
- package/dist/lib/components/AcSectionContent.vue.d.ts +2 -2
- package/dist/lib/components/AcSectionContent.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/lib/components/AcSegmentedControl.vue.d.ts +1 -1
- package/dist/lib/components/AcSegmentedControl.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/lib/components/AcSelect.vue.d.ts +4 -4
- package/dist/lib/components/AcSelect.vue_vue_type_script_setup_true_lang.js +230 -227
- package/dist/lib/components/AcSidePanel.vue_vue_type_script_setup_true_lang.js +31 -31
- package/dist/lib/components/AcSideTabs.vue.d.ts +1 -1
- package/dist/lib/components/AcSideTabs.vue_vue_type_script_setup_true_lang.js +37 -37
- package/dist/lib/components/AcSidebar.vue.d.ts +3 -3
- package/dist/lib/components/AcSidebar.vue_vue_type_script_setup_true_lang.js +75 -75
- package/dist/lib/components/AcSidebarItem.vue_vue_type_script_setup_true_lang.js +33 -32
- package/dist/lib/components/AcSidebarSection.vue_vue_type_script_setup_true_lang.js +6 -6
- package/dist/lib/components/AcSkeleton.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/lib/components/AcSlider.vue.d.ts +1 -1
- package/dist/lib/components/AcSlider.vue_vue_type_script_setup_true_lang.js +174 -172
- package/dist/lib/components/AcStatCard.vue.d.ts +3 -3
- package/dist/lib/components/AcStatCard.vue_vue_type_script_setup_true_lang.js +90 -85
- package/dist/lib/components/AcStatusBar.vue.d.ts +1 -1
- package/dist/lib/components/AcStatusBar.vue_vue_type_script_setup_true_lang.js +6 -6
- package/dist/lib/components/AcSteps.vue_vue_type_script_setup_true_lang.js +28 -28
- package/dist/lib/components/AcSwitch.vue_vue_type_script_setup_true_lang.js +39 -34
- package/dist/lib/components/AcSwitchCard.js +5 -0
- package/dist/lib/components/AcSwitchCard.vue.d.ts +59 -0
- package/dist/lib/components/AcSwitchCard.vue_vue_type_script_setup_true_lang.js +119 -0
- package/dist/lib/components/AcTable.vue_vue_type_script_setup_true_lang.js +87 -87
- package/dist/lib/components/AcTabs.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/lib/components/AcTag.vue.d.ts +1 -1
- package/dist/lib/components/AcTag.vue_vue_type_script_setup_true_lang.js +22 -22
- package/dist/lib/components/AcTagInput.js +5 -0
- package/dist/lib/components/AcTagInput.vue.d.ts +74 -0
- package/dist/lib/components/AcTagInput.vue_vue_type_script_setup_true_lang.js +291 -0
- package/dist/lib/components/AcTextarea.vue.d.ts +3 -3
- package/dist/lib/components/AcTextarea.vue_vue_type_script_setup_true_lang.js +89 -64
- package/dist/lib/components/AcThemeMode.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/lib/components/AcTimePicker.js +5 -0
- package/dist/lib/components/AcTimePicker.vue.d.ts +65 -0
- package/dist/lib/components/AcTimePicker.vue_vue_type_script_setup_true_lang.js +463 -0
- package/dist/lib/components/AcToaster.vue_vue_type_script_setup_true_lang.js +65 -71
- package/dist/lib/components/AcTooltip.vue.d.ts +1 -1
- package/dist/lib/components/AcTooltip.vue_vue_type_script_setup_true_lang.js +77 -67
- package/dist/lib/components/AcUsageCard.vue_vue_type_script_setup_true_lang.js +27 -27
- package/dist/lib/components/AcUserMenu.vue_vue_type_script_setup_true_lang.js +111 -103
- package/dist/lib/components/index.d.ts +14 -2
- package/dist/lib/components/status.d.ts +26 -0
- package/dist/lib/components/status.js +110 -0
- package/dist/lib/composables/copyText.d.ts +2 -1
- package/dist/lib/composables/copyText.js +2 -2
- package/dist/lib/composables/useApiPagination.d.ts +55 -0
- package/dist/lib/composables/useApiPagination.js +58 -0
- package/dist/lib/composables/useBulkSelection.d.ts +44 -0
- package/dist/lib/composables/useBulkSelection.js +41 -0
- package/dist/lib/composables/useFormValidation.d.ts +65 -0
- package/dist/lib/composables/useFormValidation.js +148 -0
- package/dist/lib/composables/useTablePagination.d.ts +49 -0
- package/dist/lib/composables/useTablePagination.js +41 -0
- package/dist/lib/editor/theme.js +65 -62
- package/dist/lib/index.d.ts +14 -0
- package/dist/lib/index.js +95 -78
- package/dist/lib/theme.css +391 -272
- package/package.json +11 -4
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { computed as e, getCurrentScope as t, ref as n, toValue as r, watch as i } from "vue";
|
|
2
|
+
//#region src/lib/composables/useApiPagination.ts
|
|
3
|
+
function a(e) {
|
|
4
|
+
return e == null ? void 0 : Number(e);
|
|
5
|
+
}
|
|
6
|
+
function o(o = {}) {
|
|
7
|
+
let s = typeof o == "number" ? { pageSize: o } : o, c = n(1), l = n(s.pageSize ?? 10), u = n({ 1: "" }), d = e(() => u.value[c.value] ?? ""), f = e(() => Object.keys(u.value).map(Number).sort((e, t) => e - t)), p = e(() => u.value[c.value + 1] !== void 0), m = e(() => c.value > 1), h = e(() => ({
|
|
8
|
+
total: a(r(s.total)),
|
|
9
|
+
hasNext: p.value,
|
|
10
|
+
hasPrev: m.value,
|
|
11
|
+
knownPages: f.value,
|
|
12
|
+
itemsOnPage: a(r(s.itemsOnPage))
|
|
13
|
+
}));
|
|
14
|
+
function g(e, t = c.value) {
|
|
15
|
+
if (e == null) return;
|
|
16
|
+
let n = { ...u.value };
|
|
17
|
+
if (e) n[t + 1] = e;
|
|
18
|
+
else for (let e of Object.keys(n).map(Number)) e > t && delete n[e];
|
|
19
|
+
u.value = n;
|
|
20
|
+
}
|
|
21
|
+
function _(e) {
|
|
22
|
+
return u.value[e] !== void 0 && (c.value = e, !0);
|
|
23
|
+
}
|
|
24
|
+
function v() {
|
|
25
|
+
_(c.value + 1);
|
|
26
|
+
}
|
|
27
|
+
function y() {
|
|
28
|
+
_(c.value - 1);
|
|
29
|
+
}
|
|
30
|
+
function b() {
|
|
31
|
+
u.value = { 1: "" }, c.value = 1;
|
|
32
|
+
}
|
|
33
|
+
i(c, (e, t) => {
|
|
34
|
+
u.value[e] === void 0 && (c.value = t);
|
|
35
|
+
}, { flush: "sync" }), i(l, b, { flush: "sync" });
|
|
36
|
+
let x = s.nextToken;
|
|
37
|
+
if (x !== void 0) {
|
|
38
|
+
let e = () => i(() => r(x), (e) => g(e), { immediate: !0 }), n = t();
|
|
39
|
+
n ? Promise.resolve().then(() => n.active && n.run(e)) : e();
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
page: c,
|
|
43
|
+
pageSize: l,
|
|
44
|
+
pageToken: d,
|
|
45
|
+
tokens: u,
|
|
46
|
+
knownPages: f,
|
|
47
|
+
hasNext: p,
|
|
48
|
+
hasPrev: m,
|
|
49
|
+
next: v,
|
|
50
|
+
prev: y,
|
|
51
|
+
goTo: _,
|
|
52
|
+
reset: b,
|
|
53
|
+
setNextToken: g,
|
|
54
|
+
paginationProps: h
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { o as useApiPagination };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from "vue";
|
|
2
|
+
export interface UseBulkSelectionOptions<T, K = unknown> {
|
|
3
|
+
/** How to identify a row: a property name, the same as AcTable's `row-key`, or a function. Default `"id"`. Cloud-ui rows use `"uuid"`. */
|
|
4
|
+
key?: string | ((row: T) => K);
|
|
5
|
+
/** Decides per row whether it can be picked, e.g. not platform-managed and not already deleting. Pair it with AcTable's `row-disabled`. */
|
|
6
|
+
selectable?: (row: T) => boolean;
|
|
7
|
+
/** Drops picked keys whose rows leave `rows` or stop being selectable (deleted, filtered out, gone after a refetch). Default `true`. Turn it off when `rows` is one page of a server list and the selection spans pages; call `prune` yourself then. */
|
|
8
|
+
autoPrune?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface BulkSelection<T, K = unknown> {
|
|
11
|
+
/** Keys of the picked rows. Bind to AcTable with `v-model:selected`. */
|
|
12
|
+
selected: Ref<K[]>;
|
|
13
|
+
/** The picked rows that are in `rows`, for the confirm dialog and the batch request. */
|
|
14
|
+
selectedRows: ComputedRef<T[]>;
|
|
15
|
+
/** The rows that pass `selectable`. */
|
|
16
|
+
selectableRows: ComputedRef<T[]>;
|
|
17
|
+
/** Number of picked rows, for AcBulkActionBar's `count`. */
|
|
18
|
+
count: ComputedRef<number>;
|
|
19
|
+
hasSelection: ComputedRef<boolean>;
|
|
20
|
+
/** Every selectable row is picked. Drives a select-all checkbox. */
|
|
21
|
+
allSelected: ComputedRef<boolean>;
|
|
22
|
+
/** Some, but not all, selectable rows are picked. Drives the checkbox's `indeterminate`. */
|
|
23
|
+
someSelected: ComputedRef<boolean>;
|
|
24
|
+
isSelected: (key: K) => boolean;
|
|
25
|
+
/** Picks or unpicks one row by key. Keys of rows that aren't selectable are ignored. */
|
|
26
|
+
toggle: (key: K) => void;
|
|
27
|
+
/** Picks every selectable row, or clears when they're all picked already. */
|
|
28
|
+
toggleAll: () => void;
|
|
29
|
+
selectAll: () => void;
|
|
30
|
+
/** Empties the selection, e.g. on AcBulkActionBar's `clear` or after the batch request succeeds. */
|
|
31
|
+
clear: () => void;
|
|
32
|
+
/** Drops picked keys that aren't among `rows` (default: the current selectable rows). */
|
|
33
|
+
prune: (rows?: T[]) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Tracks which rows are picked for a bulk action, for AcTable's `v-model:selected`, AcCheckBox and AcBulkActionBar.
|
|
37
|
+
*
|
|
38
|
+
* Pass the whole list (every page, when paging in the browser) so picks survive a page change.
|
|
39
|
+
* Keys whose rows disappear are dropped automatically, so a stale key never reaches a batch request.
|
|
40
|
+
*
|
|
41
|
+
* @param rows The list the selection is made from, as an array, ref or getter.
|
|
42
|
+
* @param options `key`, `selectable` and `autoPrune`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function useBulkSelection<T extends object, K = unknown>(rows: MaybeRefOrGetter<T[]>, options?: UseBulkSelectionOptions<T, K>): BulkSelection<T, K>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { computed as e, ref as t, toValue as n, watch as r } from "vue";
|
|
2
|
+
//#region src/lib/composables/useBulkSelection.ts
|
|
3
|
+
function i(i, a = {}) {
|
|
4
|
+
let { key: o = "id", selectable: s = () => !0, autoPrune: c = !0 } = a, l = typeof o == "function" ? o : (e) => e[o], u = t([]), d = e(() => n(i).filter(s)), f = e(() => d.value.map(l)), p = e(() => new Set(u.value)), m = e(() => d.value.filter((e) => p.value.has(l(e)))), h = e(() => u.value.length), g = e(() => u.value.length > 0), _ = e(() => f.value.length > 0 && f.value.every((e) => p.value.has(e))), v = e(() => g.value && !_.value);
|
|
5
|
+
function y(e) {
|
|
6
|
+
return p.value.has(e);
|
|
7
|
+
}
|
|
8
|
+
function b(e) {
|
|
9
|
+
y(e) ? u.value = u.value.filter((t) => t !== e) : f.value.includes(e) && (u.value = [...u.value, e]);
|
|
10
|
+
}
|
|
11
|
+
function x() {
|
|
12
|
+
u.value = [...f.value];
|
|
13
|
+
}
|
|
14
|
+
function S() {
|
|
15
|
+
u.value = [];
|
|
16
|
+
}
|
|
17
|
+
function C() {
|
|
18
|
+
_.value ? S() : x();
|
|
19
|
+
}
|
|
20
|
+
function w(e) {
|
|
21
|
+
let t = new Set(e ? e.map(l) : f.value), n = u.value.filter((e) => t.has(e));
|
|
22
|
+
n.length !== u.value.length && (u.value = n);
|
|
23
|
+
}
|
|
24
|
+
return c && r(f, () => w()), {
|
|
25
|
+
selected: u,
|
|
26
|
+
selectedRows: m,
|
|
27
|
+
selectableRows: d,
|
|
28
|
+
count: h,
|
|
29
|
+
hasSelection: g,
|
|
30
|
+
allSelected: _,
|
|
31
|
+
someSelected: v,
|
|
32
|
+
isSelected: y,
|
|
33
|
+
toggle: b,
|
|
34
|
+
toggleAll: C,
|
|
35
|
+
selectAll: x,
|
|
36
|
+
clear: S,
|
|
37
|
+
prune: w
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { i as useBulkSelection };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { MaybeRefOrGetter } from "vue";
|
|
2
|
+
/** Field names of a form, with dots for nested objects: `name`, `spec.replicas`. */
|
|
3
|
+
export type FieldPath<T> = T extends object ? {
|
|
4
|
+
[K in keyof T & string]: NonNullable<T[K]> extends readonly unknown[] | Date | ((...args: never[]) => unknown) ? K : NonNullable<T[K]> extends object ? K | `${K}.${FieldPath<NonNullable<T[K]>>}` : K;
|
|
5
|
+
}[keyof T & string] : never;
|
|
6
|
+
/** A rule that needs no setting. `k8sName` is a Kubernetes name (RFC 1123 label); `alphanumericDash` only checks the characters. */
|
|
7
|
+
export type SimpleRuleName = "required" | "email" | "url" | "k8sName" | "alphanumericDash" | "integer" | "nonEmptyList";
|
|
8
|
+
/** Checks a value and returns a message when it's wrong. Return nothing (or `""`) when it's fine. */
|
|
9
|
+
export type RuleFn<T = Record<string, unknown>> = (value: unknown, values: T) => string | false | null | undefined | void;
|
|
10
|
+
/**
|
|
11
|
+
* One check on a field. Write it as:
|
|
12
|
+
* - a name: `"required"`, `"email"`, `"url"`, `"k8sName"`, `"alphanumericDash"`, `"integer"`, `"nonEmptyList"`;
|
|
13
|
+
* - cloud-ui's shorthand: `"minLength|3"`, `"maxLength|63"`, `"min|1"`, `"max|9"`, `"pattern|^v\\d+$|Start with v"`;
|
|
14
|
+
* - an object, to set the message: `{ required: true, message: "Choose a database." }`, `{ minLength: 8 }`, `{ pattern: /^v\d+$/, message: "…" }`;
|
|
15
|
+
* - a function `(value, values) => message | undefined`, e.g. to compare two fields.
|
|
16
|
+
*/
|
|
17
|
+
export type Rule<T = Record<string, unknown>> = SimpleRuleName | `minLength|${number}` | `maxLength|${number}` | `min|${number}` | `max|${number}` | `pattern|${string}` | ({
|
|
18
|
+
[K in SimpleRuleName]: {
|
|
19
|
+
[P in K]: true;
|
|
20
|
+
} & {
|
|
21
|
+
message?: string;
|
|
22
|
+
};
|
|
23
|
+
}[SimpleRuleName]) | {
|
|
24
|
+
minLength: number;
|
|
25
|
+
message?: string;
|
|
26
|
+
} | {
|
|
27
|
+
maxLength: number;
|
|
28
|
+
message?: string;
|
|
29
|
+
} | {
|
|
30
|
+
min: number;
|
|
31
|
+
message?: string;
|
|
32
|
+
} | {
|
|
33
|
+
max: number;
|
|
34
|
+
message?: string;
|
|
35
|
+
} | {
|
|
36
|
+
pattern: RegExp | string;
|
|
37
|
+
message?: string;
|
|
38
|
+
} | RuleFn<T>;
|
|
39
|
+
/** Rules per field, checked in order; the first failing rule's message is shown. */
|
|
40
|
+
export type FormRules<T> = {
|
|
41
|
+
[K in FieldPath<T>]?: Rule<T>[];
|
|
42
|
+
};
|
|
43
|
+
export interface FormValidationOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Re-checks a field as it changes once it has been checked: a fixed error clears straight away,
|
|
46
|
+
* and a field that was fine waits for the next `validateField` (on blur) before showing a new one. Default `true`.
|
|
47
|
+
*/
|
|
48
|
+
live?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validates a form object field by field and keeps one message per field in `errors`,
|
|
52
|
+
* ready for `:error-msg="errors.name"` on AcInput, AcSelect, AcTextarea and the other fields.
|
|
53
|
+
*
|
|
54
|
+
* Empty values pass every rule except `required` and `nonEmptyList`, so optional fields can still have a format.
|
|
55
|
+
*/
|
|
56
|
+
export declare function useFormValidation<T extends object>(values: MaybeRefOrGetter<T>, rules: MaybeRefOrGetter<FormRules<T>>, options?: FormValidationOptions): {
|
|
57
|
+
errors: { [K in FieldPath<T>]?: string | undefined; };
|
|
58
|
+
touched: { [K_1 in FieldPath<T>]?: boolean | undefined; };
|
|
59
|
+
errorCount: import("vue").ComputedRef<number>;
|
|
60
|
+
validate: () => boolean;
|
|
61
|
+
validateField: (field: FieldPath<T>) => string;
|
|
62
|
+
reset: (...only: FieldPath<T>[]) => void;
|
|
63
|
+
/** cloud-ui's name for `validate`. */
|
|
64
|
+
validateForm: () => boolean;
|
|
65
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { computed as e, reactive as t, toValue as n, watch as r } from "vue";
|
|
2
|
+
//#region src/lib/composables/useFormValidation.ts
|
|
3
|
+
var i = /^[^\s@]+@[^\s@]+\.[^\s@]+$/, a = /^[a-z0-9-]+$/, o = {
|
|
4
|
+
required: (e) => Array.isArray(e) ? "Add at least one item." : e === !1 ? "Check this box to continue." : e == null ? "Choose an option." : "Enter a value.",
|
|
5
|
+
email: () => "Enter an email address like name@example.com.",
|
|
6
|
+
url: () => "Enter a full URL that starts with https:// or http://.",
|
|
7
|
+
alphanumericDash: () => "Use lowercase letters, numbers and hyphens.",
|
|
8
|
+
integer: () => "Enter a whole number.",
|
|
9
|
+
nonEmptyList: () => "Add at least one item.",
|
|
10
|
+
number: () => "Enter a number.",
|
|
11
|
+
minLength: (e) => `Enter at least ${e} characters.`,
|
|
12
|
+
maxLength: (e) => `Use ${e} characters or fewer.`,
|
|
13
|
+
min: (e) => `Enter ${e} or more.`,
|
|
14
|
+
max: (e) => `Enter ${e} or less.`,
|
|
15
|
+
pattern: () => "Check the format of this value."
|
|
16
|
+
};
|
|
17
|
+
function s(e) {
|
|
18
|
+
return e == null || e === !1 ? !0 : typeof e == "string" ? e.trim() === "" : typeof e == "number" ? Number.isNaN(e) : Array.isArray(e) ? e.length === 0 : !1;
|
|
19
|
+
}
|
|
20
|
+
function c(e) {
|
|
21
|
+
return typeof e == "number" ? e : typeof e == "string" && e.trim() !== "" ? Number(e) : NaN;
|
|
22
|
+
}
|
|
23
|
+
function l(e) {
|
|
24
|
+
try {
|
|
25
|
+
let t = new URL(e);
|
|
26
|
+
return (t.protocol === "https:" || t.protocol === "http:") && !!t.hostname;
|
|
27
|
+
} catch {
|
|
28
|
+
return !1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function u(e) {
|
|
32
|
+
return a.test(e) ? !/^[a-z0-9]/.test(e) || !/[a-z0-9]$/.test(e) ? "Start and end with a lowercase letter or number." : e.length > 63 ? o.maxLength(63) : "" : o.alphanumericDash();
|
|
33
|
+
}
|
|
34
|
+
function d(e) {
|
|
35
|
+
return typeof e == "string" ? new RegExp(e) : e;
|
|
36
|
+
}
|
|
37
|
+
function f(e) {
|
|
38
|
+
if (typeof e == "function") return {
|
|
39
|
+
required: !1,
|
|
40
|
+
check: (t, n) => e(t, n) || ""
|
|
41
|
+
};
|
|
42
|
+
if (typeof e == "string") {
|
|
43
|
+
let [t, ...n] = e.split("|");
|
|
44
|
+
return f(t === "pattern" ? {
|
|
45
|
+
pattern: n[0] ?? "",
|
|
46
|
+
message: n.slice(1).join("|") || void 0
|
|
47
|
+
} : t === "minLength" || t === "maxLength" || t === "min" || t === "max" ? { [t]: Number(n[0]) } : { [t]: !0 });
|
|
48
|
+
}
|
|
49
|
+
let t = e.message, n = (e) => t || e;
|
|
50
|
+
if ("required" in e) return {
|
|
51
|
+
required: !0,
|
|
52
|
+
check: (e) => s(e) ? n(o.required(e)) : ""
|
|
53
|
+
};
|
|
54
|
+
if ("nonEmptyList" in e) return {
|
|
55
|
+
required: !0,
|
|
56
|
+
check: (e) => Array.isArray(e) && !e.length ? n(o.nonEmptyList()) : ""
|
|
57
|
+
};
|
|
58
|
+
if ("email" in e) return {
|
|
59
|
+
required: !1,
|
|
60
|
+
check: (e) => i.test(String(e).trim()) ? "" : n(o.email())
|
|
61
|
+
};
|
|
62
|
+
if ("url" in e) return {
|
|
63
|
+
required: !1,
|
|
64
|
+
check: (e) => l(String(e).trim()) ? "" : n(o.url())
|
|
65
|
+
};
|
|
66
|
+
if ("alphanumericDash" in e) return {
|
|
67
|
+
required: !1,
|
|
68
|
+
check: (e) => a.test(String(e)) ? "" : n(o.alphanumericDash())
|
|
69
|
+
};
|
|
70
|
+
if ("k8sName" in e) return {
|
|
71
|
+
required: !1,
|
|
72
|
+
check: (e) => u(String(e)) ? n(u(String(e))) : ""
|
|
73
|
+
};
|
|
74
|
+
if ("integer" in e) return {
|
|
75
|
+
required: !1,
|
|
76
|
+
check: (e) => Number.isInteger(c(e)) ? "" : n(o.integer())
|
|
77
|
+
};
|
|
78
|
+
if ("minLength" in e) return {
|
|
79
|
+
required: !1,
|
|
80
|
+
check: (t) => String(t).length < e.minLength ? n(o.minLength(e.minLength)) : ""
|
|
81
|
+
};
|
|
82
|
+
if ("maxLength" in e) return {
|
|
83
|
+
required: !1,
|
|
84
|
+
check: (t) => String(t).length > e.maxLength ? n(o.maxLength(e.maxLength)) : ""
|
|
85
|
+
};
|
|
86
|
+
if ("min" in e || "max" in e) return {
|
|
87
|
+
required: !1,
|
|
88
|
+
check: (t) => {
|
|
89
|
+
let r = c(t);
|
|
90
|
+
return Number.isNaN(r) ? n(o.number()) : "min" in e && r < e.min ? n(o.min(e.min)) : "max" in e && r > e.max ? n(o.max(e.max)) : "";
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
if ("pattern" in e) {
|
|
94
|
+
let t = d(e.pattern);
|
|
95
|
+
return {
|
|
96
|
+
required: !1,
|
|
97
|
+
check: (e) => t.test(String(e)) ? "" : n(o.pattern())
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
required: !1,
|
|
102
|
+
check: () => ""
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function p(e, t) {
|
|
106
|
+
return t.split(".").reduce((e, t) => typeof e == "object" && e ? e[t] : void 0, e);
|
|
107
|
+
}
|
|
108
|
+
function m(i, a, o = {}) {
|
|
109
|
+
let c = t({}), l = t({}), u = e(() => Object.keys(n(a))), d = e(() => Object.values(c).filter(Boolean).length);
|
|
110
|
+
function m(e) {
|
|
111
|
+
let t = n(a)[e] ?? [], r = n(i), o = p(r, e), c = s(o);
|
|
112
|
+
for (let e of t) {
|
|
113
|
+
let { required: t, check: n } = f(e);
|
|
114
|
+
if (c && !t && typeof e != "function") continue;
|
|
115
|
+
let i = n(o, r);
|
|
116
|
+
if (i) return i;
|
|
117
|
+
}
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
function h(e) {
|
|
121
|
+
let t = m(e);
|
|
122
|
+
return c[e] = t, l[e] = !0, t;
|
|
123
|
+
}
|
|
124
|
+
function g() {
|
|
125
|
+
return u.value.map(h).every((e) => !e);
|
|
126
|
+
}
|
|
127
|
+
function _(...e) {
|
|
128
|
+
let t = e.length ? e : Object.keys(c);
|
|
129
|
+
for (let e of t) delete c[e], delete l[e];
|
|
130
|
+
}
|
|
131
|
+
return o.live !== !1 && r(() => u.value.map((e) => l[e] ? p(n(i), e) : void 0), () => {
|
|
132
|
+
for (let e of u.value) {
|
|
133
|
+
if (!l[e]) continue;
|
|
134
|
+
let t = m(e);
|
|
135
|
+
(!t || c[e]) && (c[e] = t);
|
|
136
|
+
}
|
|
137
|
+
}, { deep: !0 }), {
|
|
138
|
+
errors: c,
|
|
139
|
+
touched: l,
|
|
140
|
+
errorCount: d,
|
|
141
|
+
validate: g,
|
|
142
|
+
validateField: h,
|
|
143
|
+
reset: _,
|
|
144
|
+
validateForm: g
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//#endregion
|
|
148
|
+
export { m as useFormValidation };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, WatchSource } from "vue";
|
|
2
|
+
export interface UseTablePaginationOptions {
|
|
3
|
+
/** Page to start on, from 1. Default 1. */
|
|
4
|
+
page?: number;
|
|
5
|
+
/** Goes back to page 1 when this changes, e.g. a search query, a filter or the table's `sortBy`. */
|
|
6
|
+
resetOn?: WatchSource | WatchSource[];
|
|
7
|
+
}
|
|
8
|
+
export interface TablePagination<T> {
|
|
9
|
+
/** The current page, from 1. Bind to AcPagination with `v-model:page`. */
|
|
10
|
+
page: Ref<number>;
|
|
11
|
+
/** Rows per page. Bind to AcPagination with `v-model:page-size`. */
|
|
12
|
+
pageSize: Ref<number>;
|
|
13
|
+
/** The rows on the current page; pass them to AcTable's `rows`. */
|
|
14
|
+
pageRows: ComputedRef<T[]>;
|
|
15
|
+
/** Number of rows across all pages. */
|
|
16
|
+
total: ComputedRef<number>;
|
|
17
|
+
/** Number of pages, at least 1. */
|
|
18
|
+
pageCount: ComputedRef<number>;
|
|
19
|
+
/** The current page's slice of the list, 0-based and end-exclusive. */
|
|
20
|
+
range: ComputedRef<{
|
|
21
|
+
start: number;
|
|
22
|
+
end: number;
|
|
23
|
+
}>;
|
|
24
|
+
hasNext: ComputedRef<boolean>;
|
|
25
|
+
hasPrev: ComputedRef<boolean>;
|
|
26
|
+
next: () => void;
|
|
27
|
+
prev: () => void;
|
|
28
|
+
/** Moves to `page`, clamped to the first and last page. */
|
|
29
|
+
goTo: (page: number) => void;
|
|
30
|
+
/** Goes back to page 1. */
|
|
31
|
+
reset: () => void;
|
|
32
|
+
/** AcPagination props that aren't models: `v-bind="paginationProps"`. */
|
|
33
|
+
paginationProps: ComputedRef<{
|
|
34
|
+
total: number;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Pages a list in the browser, for AcTable plus AcPagination.
|
|
39
|
+
*
|
|
40
|
+
* Pass the whole list (already filtered and sorted) and bind the result:
|
|
41
|
+
* `<AcTable :rows="pageRows" />` and
|
|
42
|
+
* `<AcPagination v-model:page="page" v-model:page-size="pageSize" v-bind="paginationProps" />`.
|
|
43
|
+
* When the list shrinks below the current page (rows deleted, a refetch), the page moves back to the last one.
|
|
44
|
+
* Pass `resetOn` to go back to page 1 when a search or filter changes.
|
|
45
|
+
*
|
|
46
|
+
* @param rows The full list, as an array, ref or getter.
|
|
47
|
+
* @param pageSize Rows per page. Pass a writable ref to share it; a number or getter starts an internal ref. Default 10.
|
|
48
|
+
*/
|
|
49
|
+
export declare function useTablePagination<T>(rows: MaybeRefOrGetter<T[]>, pageSize?: MaybeRefOrGetter<number>, options?: UseTablePaginationOptions): TablePagination<T>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { computed as e, isReadonly as t, isRef as n, ref as r, toValue as i, watch as a } from "vue";
|
|
2
|
+
//#region src/lib/composables/useTablePagination.ts
|
|
3
|
+
function o(o, s = 10, c = {}) {
|
|
4
|
+
let l = r(c.page ?? 1), u = n(s) && !t(s), d = u ? s : r(i(s));
|
|
5
|
+
!u && typeof s != "number" && a(() => i(s), (e) => d.value = e);
|
|
6
|
+
let f = e(() => i(o).length), p = e(() => Math.max(1, d.value)), m = e(() => Math.max(1, Math.ceil(f.value / p.value))), h = e(() => Math.min(Math.max(1, l.value), m.value)), g = e(() => ({
|
|
7
|
+
start: Math.min((h.value - 1) * p.value, f.value),
|
|
8
|
+
end: Math.min(h.value * p.value, f.value)
|
|
9
|
+
})), _ = e(() => i(o).slice(g.value.start, g.value.end)), v = e(() => h.value < m.value), y = e(() => h.value > 1), b = e(() => ({ total: f.value }));
|
|
10
|
+
function x(e) {
|
|
11
|
+
l.value = Math.min(Math.max(1, Math.trunc(e)), m.value);
|
|
12
|
+
}
|
|
13
|
+
function S() {
|
|
14
|
+
x(h.value + 1);
|
|
15
|
+
}
|
|
16
|
+
function C() {
|
|
17
|
+
x(h.value - 1);
|
|
18
|
+
}
|
|
19
|
+
function w() {
|
|
20
|
+
l.value = 1;
|
|
21
|
+
}
|
|
22
|
+
return a(m, (e) => {
|
|
23
|
+
l.value > e && (l.value = e);
|
|
24
|
+
}), c.resetOn && a(c.resetOn, w), {
|
|
25
|
+
page: l,
|
|
26
|
+
pageSize: d,
|
|
27
|
+
pageRows: _,
|
|
28
|
+
total: f,
|
|
29
|
+
pageCount: m,
|
|
30
|
+
range: g,
|
|
31
|
+
hasNext: v,
|
|
32
|
+
hasPrev: y,
|
|
33
|
+
next: S,
|
|
34
|
+
prev: C,
|
|
35
|
+
goTo: x,
|
|
36
|
+
reset: w,
|
|
37
|
+
paginationProps: b
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { o as useTablePagination };
|