yuyeon 0.0.9 → 0.0.10

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 (84) hide show
  1. package/dist/style.css +1 -1
  2. package/dist/yuyeon.mjs +2753 -1505
  3. package/dist/yuyeon.umd.js +1 -1
  4. package/lib/components/button/YButton.mjs +31 -27
  5. package/lib/components/button/YButton.mjs.map +1 -1
  6. package/lib/components/button/YButton.scss +13 -6
  7. package/lib/components/icons/YIconCheckbox.mjs +5 -3
  8. package/lib/components/icons/YIconCheckbox.mjs.map +1 -1
  9. package/lib/components/icons/YIconCheckbox.scss +26 -0
  10. package/lib/components/icons/YIconSort.mjs +45 -0
  11. package/lib/components/icons/YIconSort.mjs.map +1 -0
  12. package/lib/components/icons/YIconSort.scss +23 -0
  13. package/lib/components/pagination/YPagination.mjs +7 -1
  14. package/lib/components/pagination/YPagination.mjs.map +1 -1
  15. package/lib/components/pagination/YPagination.scss +1 -1
  16. package/lib/components/table/YDataTable.mjs +17 -7
  17. package/lib/components/table/YDataTable.mjs.map +1 -1
  18. package/lib/components/table/YDataTableBody.mjs +69 -6
  19. package/lib/components/table/YDataTableBody.mjs.map +1 -1
  20. package/lib/components/table/YDataTableCell.mjs +18 -4
  21. package/lib/components/table/YDataTableCell.mjs.map +1 -1
  22. package/lib/components/table/YDataTableControl.mjs.map +1 -1
  23. package/lib/components/table/YDataTableHead.mjs +144 -5
  24. package/lib/components/table/YDataTableHead.mjs.map +1 -1
  25. package/lib/components/table/YDataTableRow.mjs +66 -3
  26. package/lib/components/table/YDataTableRow.mjs.map +1 -1
  27. package/lib/components/table/YDataTableServer.mjs +103 -16
  28. package/lib/components/table/YDataTableServer.mjs.map +1 -1
  29. package/lib/components/table/YTable.mjs +17 -13
  30. package/lib/components/table/YTable.mjs.map +1 -1
  31. package/lib/components/table/YTable.scss +53 -0
  32. package/lib/components/table/composibles/header.mjs +110 -0
  33. package/lib/components/table/composibles/header.mjs.map +1 -0
  34. package/lib/components/table/composibles/items.mjs +45 -0
  35. package/lib/components/table/composibles/items.mjs.map +1 -0
  36. package/lib/components/table/composibles/options.mjs +33 -0
  37. package/lib/components/table/composibles/options.mjs.map +1 -0
  38. package/lib/components/table/composibles/pagination.mjs +82 -0
  39. package/lib/components/table/composibles/pagination.mjs.map +1 -0
  40. package/lib/components/table/composibles/selection.mjs +179 -0
  41. package/lib/components/table/composibles/selection.mjs.map +1 -0
  42. package/lib/components/table/composibles/sorting.mjs +74 -0
  43. package/lib/components/table/composibles/sorting.mjs.map +1 -0
  44. package/lib/components/table/types/index.mjs +2 -0
  45. package/lib/components/table/types/index.mjs.map +1 -0
  46. package/lib/components/tree-view/YTreeView.mjs.map +1 -1
  47. package/lib/components/tree-view/types.mjs.map +1 -1
  48. package/lib/components/tree-view/util.mjs.map +1 -1
  49. package/lib/composables/icon.mjs +2 -0
  50. package/lib/composables/icon.mjs.map +1 -0
  51. package/lib/styles/base.scss +8 -0
  52. package/lib/types/index.mjs +2 -0
  53. package/lib/types/index.mjs.map +1 -0
  54. package/lib/util/array.mjs +3 -0
  55. package/lib/util/array.mjs.map +1 -1
  56. package/lib/util/common.mjs +13 -0
  57. package/lib/util/common.mjs.map +1 -1
  58. package/lib/util/vue-component.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/types/components/button/YButton.d.ts +135 -66
  61. package/types/components/checkbox/YInputCheckbox.d.ts +6 -3
  62. package/types/components/icons/YIconCheckbox.d.ts +6 -3
  63. package/types/components/icons/YIconSort.d.ts +18 -0
  64. package/types/components/pagination/YPagination.d.ts +7 -0
  65. package/types/components/table/YDataTable.d.ts +282 -19
  66. package/types/components/table/YDataTableBody.d.ts +34 -6
  67. package/types/components/table/YDataTableCell.d.ts +50 -0
  68. package/types/components/table/YDataTableHead.d.ts +67 -5
  69. package/types/components/table/YDataTableRow.d.ts +30 -0
  70. package/types/components/table/YDataTableServer.d.ts +317 -29
  71. package/types/components/table/YTable.d.ts +41 -0
  72. package/types/components/table/composibles/header.d.ts +66 -0
  73. package/types/components/table/composibles/items.d.ts +54 -0
  74. package/types/components/table/composibles/options.d.ts +10 -0
  75. package/types/components/table/composibles/pagination.d.ts +68 -0
  76. package/types/components/table/composibles/selection.d.ts +67 -0
  77. package/types/components/table/composibles/sorting.d.ts +41 -0
  78. package/types/components/table/types/index.d.ts +77 -0
  79. package/types/components/tree-view/YTreeView.d.ts +14 -14
  80. package/types/components/tree-view/types.d.ts +3 -3
  81. package/types/components/tree-view/util.d.ts +2 -2
  82. package/types/types/index.d.ts +1 -0
  83. package/types/util/array.d.ts +1 -0
  84. package/types/util/common.d.ts +2 -0
@@ -34,6 +34,8 @@ $table-cell-padding: 0 16px !default;
34
34
 
35
35
  &__container {
36
36
  > table {
37
+ font-size: 0.875rem;
38
+
37
39
  > thead,
38
40
  > tbody,
39
41
  > tfoot {
@@ -48,10 +50,17 @@ $table-cell-padding: 0 16px !default;
48
50
  > th {
49
51
  height: 56px;
50
52
  text-align: left;
53
+ border-bottom: thin solid rgba(var(--y-line-color), var(--y-line-opacity));
54
+ user-select: none;
51
55
  }
52
56
  }
53
57
 
54
58
  > tbody > tr {
59
+ &:not(:last-child) {
60
+ > td {
61
+ border-bottom: thin solid rgba(var(--y-line-color), var(--y-line-opacity));
62
+ }
63
+ }
55
64
  > td {
56
65
  height: 54px;
57
66
  }
@@ -59,3 +68,47 @@ $table-cell-padding: 0 16px !default;
59
68
  }
60
69
  }
61
70
  }
71
+
72
+ .y-data-table-cell {
73
+ &--align-end {
74
+ text-align: end;
75
+
76
+ .y-data-table-header__content {
77
+ justify-content: flex-end;
78
+ }
79
+ }
80
+
81
+ }
82
+
83
+ .y-data-table-header {
84
+ &__content {
85
+ display: flex;
86
+ align-items: center;
87
+ }
88
+
89
+ &__sorting-icon {
90
+ display: inline-flex;
91
+ width: 1em;
92
+ height: 1em;
93
+ margin-left: 4px;
94
+ cursor: pointer;
95
+
96
+ svg {
97
+ width: 1em;
98
+ height: 1em;
99
+ }
100
+
101
+ &--disabled {
102
+ opacity: 0.08;
103
+ cursor: default;
104
+ }
105
+ }
106
+ }
107
+
108
+ .y-data-table-header--select, .y-data-table-data--select {
109
+ > .y-icon-checkbox {
110
+ &:not(&--disabled) {
111
+ cursor: pointer;
112
+ }
113
+ }
114
+ }
@@ -0,0 +1,110 @@
1
+ import { inject, provide, ref, watchEffect } from 'vue';
2
+ import { propsFactory } from "../../../util/vue-component.mjs";
3
+ import { getRangeArr } from "../../../util/common.mjs";
4
+ export const pressDataTableHeader = propsFactory({
5
+ headers: {
6
+ type: Array,
7
+ default: () => []
8
+ }
9
+ }, 'YDataTable--header');
10
+ export const Y_DATA_TABLE_HEADER_KEY = Symbol.for('yuyeon.data-table.header');
11
+ export function createHeader(props, options) {
12
+ const headers = ref([]);
13
+ const columns = ref([]);
14
+ watchEffect(() => {
15
+ const rows = props.headers.length > 0 ? Array.isArray(props.headers[0]) ? props.headers : [props.headers] : [];
16
+ const flat = rows.flatMap((row, index) => row.map(column => ({
17
+ column,
18
+ rowIndex: index
19
+ })));
20
+ const rowCount = rows.length;
21
+ const defaultHeader = {
22
+ text: '',
23
+ sortable: false
24
+ };
25
+ const defaultActionHeader = {
26
+ ...defaultHeader,
27
+ width: 48
28
+ };
29
+ if (options?.enableSelect?.value) {
30
+ const foundIndex = flat.findIndex(_ref => {
31
+ let {
32
+ column
33
+ } = _ref;
34
+ return column.key === 'data-table-select';
35
+ });
36
+ if (foundIndex < 0) {
37
+ flat.unshift({
38
+ column: {
39
+ ...defaultActionHeader,
40
+ key: 'data-table-select',
41
+ rowspan: rowCount
42
+ },
43
+ rowIndex: 0
44
+ });
45
+ } else {
46
+ flat.splice(foundIndex, 1, {
47
+ column: {
48
+ ...defaultActionHeader,
49
+ ...flat[foundIndex].column
50
+ },
51
+ rowIndex: flat[foundIndex].rowIndex
52
+ });
53
+ }
54
+ }
55
+ const fixedRows = getRangeArr(rowCount).map(() => []);
56
+ const fixedOffsets = getRangeArr(rowCount).fill(0);
57
+ flat.forEach(_ref2 => {
58
+ let {
59
+ column,
60
+ rowIndex
61
+ } = _ref2;
62
+ const {
63
+ key
64
+ } = column;
65
+ for (let i = rowIndex; i <= rowIndex + (column.rowspan ?? 1) - 1; i += 1) {
66
+ fixedRows[i].push({
67
+ ...column,
68
+ key,
69
+ fixedOffset: fixedOffsets[i],
70
+ sortable: column.sortable ?? !!key
71
+ });
72
+ fixedOffsets[i] += Number(column.width ?? 0);
73
+ }
74
+ });
75
+ fixedRows.forEach(row => {
76
+ for (let i = row.length; i -= 1; i >= 0) {
77
+ if (row[i].fixed) {
78
+ row[i].lastFixed = true;
79
+ return;
80
+ }
81
+ }
82
+ });
83
+ const seen = new Set();
84
+ headers.value = fixedRows.map(row => {
85
+ const filtered = [];
86
+ for (const column of row) {
87
+ if (!seen.has(column.key)) {
88
+ seen.add(column.key);
89
+ filtered.push(column);
90
+ }
91
+ }
92
+ return filtered;
93
+ });
94
+ columns.value = fixedRows.at(-1) ?? [];
95
+ });
96
+ const data = {
97
+ headers,
98
+ columns
99
+ };
100
+ provide(Y_DATA_TABLE_HEADER_KEY, data);
101
+ return data;
102
+ }
103
+ export function useHeader() {
104
+ const data = inject(Y_DATA_TABLE_HEADER_KEY);
105
+ if (!data) {
106
+ throw new Error(`Not provided: ${Y_DATA_TABLE_HEADER_KEY.description}`);
107
+ }
108
+ return data;
109
+ }
110
+ //# sourceMappingURL=header.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.mjs","names":["inject","provide","ref","watchEffect","propsFactory","getRangeArr","pressDataTableHeader","headers","type","Array","default","Y_DATA_TABLE_HEADER_KEY","Symbol","for","createHeader","props","options","columns","rows","length","isArray","flat","flatMap","row","index","map","column","rowIndex","rowCount","defaultHeader","text","sortable","defaultActionHeader","width","enableSelect","value","foundIndex","findIndex","_ref","key","unshift","rowspan","splice","fixedRows","fixedOffsets","fill","forEach","_ref2","i","push","fixedOffset","Number","fixed","lastFixed","seen","Set","filtered","has","add","at","data","useHeader","Error","description"],"sources":["../../../../src/components/table/composibles/header.ts"],"sourcesContent":["import {\n DeepReadonly,\n InjectionKey,\n PropType,\n Ref,\n inject,\n provide,\n ref,\n watchEffect,\n} from 'vue';\n\nimport { propsFactory } from '../../../util/vue-component';\n\nimport { DataTableHeader, InternalDataTableHeader } from '../types';\nimport { getRangeArr } from \"../../../util/common\";\n\nexport const pressDataTableHeader = propsFactory(\n {\n headers: {\n type: Array as PropType<DataTableHeader[] | DataTableHeader[][]>,\n default: () => [],\n },\n },\n 'YDataTable--header',\n);\n\nexport const Y_DATA_TABLE_HEADER_KEY: InjectionKey<{\n headers: Ref<InternalDataTableHeader[][]>;\n columns: Ref<InternalDataTableHeader[]>;\n}> = Symbol.for('yuyeon.data-table.header');\n\ntype HeaderProps = {\n headers: DeepReadonly<DataTableHeader[] | DataTableHeader[][]>;\n};\n\nexport function createHeader(\n props: HeaderProps,\n options?: {\n enableSelect?: Ref<boolean>;\n },\n) {\n const headers = ref<InternalDataTableHeader[][]>([]);\n const columns = ref<InternalDataTableHeader[]>([]);\n\n watchEffect(() => {\n const rows =\n props.headers.length > 0\n ? Array.isArray(props.headers[0])\n ? (props.headers as DataTableHeader[][])\n : [props.headers as DataTableHeader[]]\n : [];\n const flat = rows.flatMap((row, index) =>\n row.map((column) => ({ column, rowIndex: index })),\n );\n const rowCount = rows.length;\n const defaultHeader = { text: '', sortable: false };\n const defaultActionHeader = { ...defaultHeader, width: 48 };\n\n if (options?.enableSelect?.value) {\n const foundIndex = flat.findIndex(\n ({ column }) => column.key === 'data-table-select',\n );\n if (foundIndex < 0) {\n flat.unshift({\n column: {\n ...defaultActionHeader,\n key: 'data-table-select',\n rowspan: rowCount,\n },\n rowIndex: 0,\n });\n } else {\n flat.splice(foundIndex, 1, {\n column: {\n ...defaultActionHeader,\n ...flat[foundIndex].column,\n },\n rowIndex: flat[foundIndex].rowIndex,\n });\n }\n }\n\n const fixedRows: InternalDataTableHeader[][] = getRangeArr(rowCount).map(() => []);\n const fixedOffsets = getRangeArr(rowCount).fill(0);\n\n flat.forEach(({ column, rowIndex }) => {\n const { key } = column;\n for (let i = rowIndex; i <= rowIndex + (column.rowspan ?? 1) - 1; i += 1) {\n fixedRows[i].push({\n ...column,\n key,\n fixedOffset: fixedOffsets[i],\n sortable: column.sortable ?? !!key,\n })\n fixedOffsets[i] += Number(column.width ?? 0);\n }\n });\n\n fixedRows.forEach((row) => {\n for (let i = row.length; i -= 1; i >= 0) {\n if (row[i].fixed) {\n row[i].lastFixed = true;\n return;\n }\n }\n })\n\n const seen = new Set();\n headers.value = fixedRows.map((row) => {\n const filtered = [];\n for (const column of row) {\n if (!seen.has(column.key)) {\n seen.add(column.key);\n filtered.push(column);\n }\n }\n return filtered;\n });\n\n columns.value = fixedRows.at(-1) ?? [];\n });\n\n const data = { headers, columns };\n\n provide(Y_DATA_TABLE_HEADER_KEY, data);\n\n return data;\n}\n\nexport function useHeader() {\n const data = inject(Y_DATA_TABLE_HEADER_KEY);\n if (!data) {\n throw new Error(`Not provided: ${Y_DATA_TABLE_HEADER_KEY.description}`);\n }\n return data;\n}\n"],"mappings":"AAAA,SAKEA,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,WAAW,QACN,KAAK;AAAC,SAEJC,YAAY;AAAA,SAGZC,WAAW;AAEpB,OAAO,MAAMC,oBAAoB,GAAGF,YAAY,CAC9C;EACEG,OAAO,EAAE;IACPC,IAAI,EAAEC,KAA0D;IAChEC,OAAO,EAAEA,CAAA,KAAM;EACjB;AACF,CAAC,EACD,oBACF,CAAC;AAED,OAAO,MAAMC,uBAGX,GAAGC,MAAM,CAACC,GAAG,CAAC,0BAA0B,CAAC;AAM3C,OAAO,SAASC,YAAYA,CAC1BC,KAAkB,EAClBC,OAEC,EACD;EACA,MAAMT,OAAO,GAAGL,GAAG,CAA8B,EAAE,CAAC;EACpD,MAAMe,OAAO,GAAGf,GAAG,CAA4B,EAAE,CAAC;EAElDC,WAAW,CAAC,MAAM;IAChB,MAAMe,IAAI,GACRH,KAAK,CAACR,OAAO,CAACY,MAAM,GAAG,CAAC,GACpBV,KAAK,CAACW,OAAO,CAACL,KAAK,CAACR,OAAO,CAAC,CAAC,CAAC,CAAC,GAC5BQ,KAAK,CAACR,OAAO,GACd,CAACQ,KAAK,CAACR,OAAO,CAAsB,GACtC,EAAE;IACR,MAAMc,IAAI,GAAGH,IAAI,CAACI,OAAO,CAAC,CAACC,GAAG,EAAEC,KAAK,KACnCD,GAAG,CAACE,GAAG,CAAEC,MAAM,KAAM;MAAEA,MAAM;MAAEC,QAAQ,EAAEH;IAAM,CAAC,CAAC,CACnD,CAAC;IACD,MAAMI,QAAQ,GAAGV,IAAI,CAACC,MAAM;IAC5B,MAAMU,aAAa,GAAG;MAAEC,IAAI,EAAE,EAAE;MAAEC,QAAQ,EAAE;IAAM,CAAC;IACnD,MAAMC,mBAAmB,GAAG;MAAE,GAAGH,aAAa;MAAEI,KAAK,EAAE;IAAG,CAAC;IAE3D,IAAIjB,OAAO,EAAEkB,YAAY,EAAEC,KAAK,EAAE;MAChC,MAAMC,UAAU,GAAGf,IAAI,CAACgB,SAAS,CAC/BC,IAAA;QAAA,IAAC;UAAEZ;QAAO,CAAC,GAAAY,IAAA;QAAA,OAAKZ,MAAM,CAACa,GAAG,KAAK,mBAAmB;MAAA,CACpD,CAAC;MACD,IAAIH,UAAU,GAAG,CAAC,EAAE;QAClBf,IAAI,CAACmB,OAAO,CAAC;UACXd,MAAM,EAAE;YACN,GAAGM,mBAAmB;YACtBO,GAAG,EAAE,mBAAmB;YACxBE,OAAO,EAAEb;UACX,CAAC;UACDD,QAAQ,EAAE;QACZ,CAAC,CAAC;MACJ,CAAC,MAAM;QACLN,IAAI,CAACqB,MAAM,CAACN,UAAU,EAAE,CAAC,EAAE;UACzBV,MAAM,EAAE;YACN,GAAGM,mBAAmB;YACtB,GAAGX,IAAI,CAACe,UAAU,CAAC,CAACV;UACtB,CAAC;UACDC,QAAQ,EAAEN,IAAI,CAACe,UAAU,CAAC,CAACT;QAC7B,CAAC,CAAC;MACJ;IACF;IAEA,MAAMgB,SAAsC,GAAGtC,WAAW,CAACuB,QAAQ,CAAC,CAACH,GAAG,CAAC,MAAM,EAAE,CAAC;IAClF,MAAMmB,YAAY,GAAGvC,WAAW,CAACuB,QAAQ,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;IAElDxB,IAAI,CAACyB,OAAO,CAACC,KAAA,IAA0B;MAAA,IAAzB;QAAErB,MAAM;QAAEC;MAAS,CAAC,GAAAoB,KAAA;MAChC,MAAM;QAAER;MAAI,CAAC,GAAGb,MAAM;MACtB,KAAK,IAAIsB,CAAC,GAAGrB,QAAQ,EAAEqB,CAAC,IAAIrB,QAAQ,IAAID,MAAM,CAACe,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAEO,CAAC,IAAI,CAAC,EAAE;QACxEL,SAAS,CAACK,CAAC,CAAC,CAACC,IAAI,CAAC;UAChB,GAAGvB,MAAM;UACTa,GAAG;UACHW,WAAW,EAAEN,YAAY,CAACI,CAAC,CAAC;UAC5BjB,QAAQ,EAAEL,MAAM,CAACK,QAAQ,IAAI,CAAC,CAACQ;QACjC,CAAC,CAAC;QACFK,YAAY,CAACI,CAAC,CAAC,IAAIG,MAAM,CAACzB,MAAM,CAACO,KAAK,IAAI,CAAC,CAAC;MAC9C;IACF,CAAC,CAAC;IAEFU,SAAS,CAACG,OAAO,CAAEvB,GAAG,IAAK;MACzB,KAAK,IAAIyB,CAAC,GAAGzB,GAAG,CAACJ,MAAM,EAAE6B,CAAC,IAAI,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;QACvC,IAAIzB,GAAG,CAACyB,CAAC,CAAC,CAACI,KAAK,EAAE;UAChB7B,GAAG,CAACyB,CAAC,CAAC,CAACK,SAAS,GAAG,IAAI;UACvB;QACF;MACF;IACF,CAAC,CAAC;IAEF,MAAMC,IAAI,GAAG,IAAIC,GAAG,CAAC,CAAC;IACtBhD,OAAO,CAAC4B,KAAK,GAAGQ,SAAS,CAAClB,GAAG,CAAEF,GAAG,IAAK;MACrC,MAAMiC,QAAQ,GAAG,EAAE;MACnB,KAAK,MAAM9B,MAAM,IAAIH,GAAG,EAAE;QACxB,IAAI,CAAC+B,IAAI,CAACG,GAAG,CAAC/B,MAAM,CAACa,GAAG,CAAC,EAAE;UACzBe,IAAI,CAACI,GAAG,CAAChC,MAAM,CAACa,GAAG,CAAC;UACpBiB,QAAQ,CAACP,IAAI,CAACvB,MAAM,CAAC;QACvB;MACF;MACA,OAAO8B,QAAQ;IACjB,CAAC,CAAC;IAEFvC,OAAO,CAACkB,KAAK,GAAGQ,SAAS,CAACgB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;EACxC,CAAC,CAAC;EAEF,MAAMC,IAAI,GAAG;IAAErD,OAAO;IAAEU;EAAQ,CAAC;EAEjChB,OAAO,CAACU,uBAAuB,EAAEiD,IAAI,CAAC;EAEtC,OAAOA,IAAI;AACb;AAEA,OAAO,SAASC,SAASA,CAAA,EAAG;EAC1B,MAAMD,IAAI,GAAG5D,MAAM,CAACW,uBAAuB,CAAC;EAC5C,IAAI,CAACiD,IAAI,EAAE;IACT,MAAM,IAAIE,KAAK,CAAE,iBAAgBnD,uBAAuB,CAACoD,WAAY,EAAC,CAAC;EACzE;EACA,OAAOH,IAAI;AACb"}
@@ -0,0 +1,45 @@
1
+ import { computed } from 'vue';
2
+ import { getPropertyFromItem } from "../../../util/common.mjs";
3
+ import { propsFactory } from "../../../util/vue-component.mjs";
4
+ export const pressDataTableItemsProps = propsFactory({
5
+ items: {
6
+ type: Array,
7
+ default: () => []
8
+ },
9
+ itemKey: {
10
+ type: [String, Array, Function],
11
+ default: 'id'
12
+ },
13
+ itemSelectable: {
14
+ type: [String, Array, Function],
15
+ default: null
16
+ },
17
+ returnItem: Boolean
18
+ }, 'YDataTable--items');
19
+ export function updateItem(props, item, index, columns) {
20
+ const value = props.returnItem ? item : getPropertyFromItem(item, props.itemKey);
21
+ const selectable = getPropertyFromItem(item, props.itemSelectable, true);
22
+ const itemColumns = columns.reduce((acc, column) => {
23
+ acc[column.key] = getPropertyFromItem(item, column.value ?? column.key);
24
+ return acc;
25
+ }, {});
26
+ return {
27
+ index,
28
+ value,
29
+ selectable,
30
+ columns: itemColumns,
31
+ raw: item
32
+ };
33
+ }
34
+ export function updateItems(props, items, columns) {
35
+ return items.map((item, index) => updateItem(props, item, index, columns));
36
+ }
37
+ export function useItems(props, columns) {
38
+ const items = computed(() => {
39
+ return updateItems(props, props.items, columns.value);
40
+ });
41
+ return {
42
+ items
43
+ };
44
+ }
45
+ //# sourceMappingURL=items.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"items.mjs","names":["computed","getPropertyFromItem","propsFactory","pressDataTableItemsProps","items","type","Array","default","itemKey","String","Function","itemSelectable","returnItem","Boolean","updateItem","props","item","index","columns","value","selectable","itemColumns","reduce","acc","column","key","raw","updateItems","map","useItems"],"sources":["../../../../src/components/table/composibles/items.ts"],"sourcesContent":["import { PropType, Ref, computed } from 'vue';\n\nimport { getPropertyFromItem } from '../../../util/common';\nimport { propsFactory } from '../../../util/vue-component';\n\nimport { CandidateKey } from '../../../types';\nimport { DataTableItem, InternalDataTableHeader } from '../types';\n\nexport type DataTableItemsProps = {\n items: any[];\n itemKey: any;\n itemSelectable: any;\n returnItem: boolean;\n};\n\nexport const pressDataTableItemsProps = propsFactory(\n {\n items: {\n type: Array as PropType<DataTableItemsProps['items']>,\n default: () => [],\n },\n itemKey: {\n type: [String, Array, Function] as PropType<any>,\n default: 'id',\n },\n itemSelectable: {\n type: [String, Array, Function] as PropType<any>,\n default: null,\n },\n returnItem: Boolean,\n },\n 'YDataTable--items',\n);\n\nexport function updateItem(\n props: Omit<DataTableItemsProps, 'items'>,\n item: any,\n index: number,\n columns: InternalDataTableHeader[],\n): DataTableItem {\n const value = props.returnItem\n ? item\n : getPropertyFromItem(item, props.itemKey);\n const selectable = getPropertyFromItem(item, props.itemSelectable, true);\n const itemColumns = columns.reduce((acc, column) => {\n acc[column.key] = getPropertyFromItem(item, column.value ?? column.key);\n return acc;\n }, {} as Record<string, unknown>);\n\n return {\n index,\n value,\n selectable,\n columns: itemColumns,\n raw: item,\n };\n}\n\nexport function updateItems(\n props: Omit<DataTableItemsProps, 'items'>,\n items: DataTableItemsProps['items'],\n columns: InternalDataTableHeader[],\n): DataTableItem[] {\n return items.map((item, index) => updateItem(props, item, index, columns));\n}\n\nexport function useItems(\n props: DataTableItemsProps,\n columns: Ref<InternalDataTableHeader[]>,\n) {\n const items = computed(() => {\n return updateItems(props, props.items, columns.value);\n });\n return { items };\n}\n"],"mappings":"AAAA,SAAwBA,QAAQ,QAAQ,KAAK;AAAC,SAErCC,mBAAmB;AAAA,SACnBC,YAAY;AAYrB,OAAO,MAAMC,wBAAwB,GAAGD,YAAY,CAClD;EACEE,KAAK,EAAE;IACLC,IAAI,EAAEC,KAA+C;IACrDC,OAAO,EAAEA,CAAA,KAAM;EACjB,CAAC;EACDC,OAAO,EAAE;IACPH,IAAI,EAAE,CAACI,MAAM,EAAEH,KAAK,EAAEI,QAAQ,CAAkB;IAChDH,OAAO,EAAE;EACX,CAAC;EACDI,cAAc,EAAE;IACdN,IAAI,EAAE,CAACI,MAAM,EAAEH,KAAK,EAAEI,QAAQ,CAAkB;IAChDH,OAAO,EAAE;EACX,CAAC;EACDK,UAAU,EAAEC;AACd,CAAC,EACD,mBACF,CAAC;AAED,OAAO,SAASC,UAAUA,CACxBC,KAAyC,EACzCC,IAAS,EACTC,KAAa,EACbC,OAAkC,EACnB;EACf,MAAMC,KAAK,GAAGJ,KAAK,CAACH,UAAU,GAC1BI,IAAI,GACJf,mBAAmB,CAACe,IAAI,EAAED,KAAK,CAACP,OAAO,CAAC;EAC5C,MAAMY,UAAU,GAAGnB,mBAAmB,CAACe,IAAI,EAAED,KAAK,CAACJ,cAAc,EAAE,IAAI,CAAC;EACxE,MAAMU,WAAW,GAAGH,OAAO,CAACI,MAAM,CAAC,CAACC,GAAG,EAAEC,MAAM,KAAK;IAClDD,GAAG,CAACC,MAAM,CAACC,GAAG,CAAC,GAAGxB,mBAAmB,CAACe,IAAI,EAAEQ,MAAM,CAACL,KAAK,IAAIK,MAAM,CAACC,GAAG,CAAC;IACvE,OAAOF,GAAG;EACZ,CAAC,EAAE,CAAC,CAA4B,CAAC;EAEjC,OAAO;IACLN,KAAK;IACLE,KAAK;IACLC,UAAU;IACVF,OAAO,EAAEG,WAAW;IACpBK,GAAG,EAAEV;EACP,CAAC;AACH;AAEA,OAAO,SAASW,WAAWA,CACzBZ,KAAyC,EACzCX,KAAmC,EACnCc,OAAkC,EACjB;EACjB,OAAOd,KAAK,CAACwB,GAAG,CAAC,CAACZ,IAAI,EAAEC,KAAK,KAAKH,UAAU,CAACC,KAAK,EAAEC,IAAI,EAAEC,KAAK,EAAEC,OAAO,CAAC,CAAC;AAC5E;AAEA,OAAO,SAASW,QAAQA,CACtBd,KAA0B,EAC1BG,OAAuC,EACvC;EACA,MAAMd,KAAK,GAAGJ,QAAQ,CAAC,MAAM;IAC3B,OAAO2B,WAAW,CAACZ,KAAK,EAAEA,KAAK,CAACX,KAAK,EAAEc,OAAO,CAACC,KAAK,CAAC;EACvD,CAAC,CAAC;EACF,OAAO;IAAEf;EAAM,CAAC;AAClB"}
@@ -0,0 +1,33 @@
1
+ import { computed, watch } from 'vue';
2
+ import { deepEqual } from "../../../util/common.mjs";
3
+ export function useOptions(_ref, emit) {
4
+ let {
5
+ page,
6
+ pageSize,
7
+ sortBy,
8
+ search
9
+ } = _ref;
10
+ const options = computed(() => {
11
+ return {
12
+ page: page.value,
13
+ pageSize: pageSize.value,
14
+ sortBy: sortBy.value,
15
+ search: search.value
16
+ };
17
+ });
18
+ watch(() => search?.value, () => {
19
+ page.value = 1;
20
+ });
21
+ let optionsCache = null;
22
+ watch(options, () => {
23
+ if (deepEqual(optionsCache, options.value)) {
24
+ return;
25
+ }
26
+ emit('update:options', options.value);
27
+ optionsCache = options.value;
28
+ }, {
29
+ deep: true,
30
+ immediate: true
31
+ });
32
+ }
33
+ //# sourceMappingURL=options.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.mjs","names":["computed","watch","deepEqual","useOptions","_ref","emit","page","pageSize","sortBy","search","options","value","optionsCache","deep","immediate"],"sources":["../../../../src/components/table/composibles/options.ts"],"sourcesContent":["import { Ref, computed, watch } from 'vue';\n\nimport { deepEqual } from '../../../util/common';\nimport { SortOption } from \"../types\";\n\ntype DataTableOptionsState = {\n page: Ref<number>;\n pageSize: Ref<number>;\n sortBy: Ref<readonly SortOption[]>;\n search: Ref<string | undefined>;\n};\n\nexport function useOptions(\n { page, pageSize, sortBy, search }: DataTableOptionsState,\n emit: Function,\n) {\n const options = computed(() => {\n return {\n page: page.value,\n pageSize: pageSize.value,\n sortBy: sortBy.value,\n search: search.value,\n };\n });\n\n watch(\n () => search?.value,\n () => {\n page.value = 1;\n },\n );\n\n let optionsCache = null as unknown;\n\n watch(\n options,\n () => {\n if (deepEqual(optionsCache, options.value)) {\n return;\n }\n emit('update:options', options.value);\n optionsCache = options.value;\n },\n { deep: true, immediate: true },\n );\n}\n"],"mappings":"AAAA,SAAcA,QAAQ,EAAEC,KAAK,QAAQ,KAAK;AAAC,SAElCC,SAAS;AAUlB,OAAO,SAASC,UAAUA,CAAAC,IAAA,EAExBC,IAAc,EACd;EAAA,IAFA;IAAEC,IAAI;IAAEC,QAAQ;IAAEC,MAAM;IAAEC;EAA8B,CAAC,GAAAL,IAAA;EAGzD,MAAMM,OAAO,GAAGV,QAAQ,CAAC,MAAM;IAC7B,OAAO;MACLM,IAAI,EAAEA,IAAI,CAACK,KAAK;MAChBJ,QAAQ,EAAEA,QAAQ,CAACI,KAAK;MACxBH,MAAM,EAAEA,MAAM,CAACG,KAAK;MACpBF,MAAM,EAAEA,MAAM,CAACE;IACjB,CAAC;EACH,CAAC,CAAC;EAEFV,KAAK,CACH,MAAMQ,MAAM,EAAEE,KAAK,EACnB,MAAM;IACJL,IAAI,CAACK,KAAK,GAAG,CAAC;EAChB,CACF,CAAC;EAED,IAAIC,YAAY,GAAG,IAAe;EAElCX,KAAK,CACHS,OAAO,EACP,MAAM;IACJ,IAAIR,SAAS,CAACU,YAAY,EAAEF,OAAO,CAACC,KAAK,CAAC,EAAE;MAC1C;IACF;IACAN,IAAI,CAAC,gBAAgB,EAAEK,OAAO,CAACC,KAAK,CAAC;IACrCC,YAAY,GAAGF,OAAO,CAACC,KAAK;EAC9B,CAAC,EACD;IAAEE,IAAI,EAAE,IAAI;IAAEC,SAAS,EAAE;EAAK,CAChC,CAAC;AACH"}
@@ -0,0 +1,82 @@
1
+ import { computed, inject, provide, watchEffect } from 'vue';
2
+ import { useModelDuplex } from "../../../composables/communication.mjs";
3
+ import { clamp } from "../../../util/common.mjs";
4
+ import { propsFactory } from "../../../util/vue-component.mjs";
5
+ export const Y_DATA_TABLE_PAGINATION_KEY = Symbol.for('yuyeon.data-table.pagination');
6
+ export const pressDataTablePaginationProps = propsFactory({
7
+ page: {
8
+ type: [Number, String],
9
+ default: 0
10
+ },
11
+ pageSize: {
12
+ type: [Number, String],
13
+ default: 10
14
+ }
15
+ }, 'YDataTable--pagination');
16
+ export function createPagination(props) {
17
+ const page = useModelDuplex(props, 'page', undefined, value => +(value ?? 0));
18
+ const pageSize = useModelDuplex(props, 'pageSize', undefined, value => +(value ?? 10));
19
+ return {
20
+ page,
21
+ pageSize
22
+ };
23
+ }
24
+ export function providePagination(options) {
25
+ const {
26
+ page,
27
+ pageSize,
28
+ total
29
+ } = options;
30
+ const startIndex = computed(() => {
31
+ if (pageSize.value === -1) return 0;
32
+ return pageSize.value * (page.value - 1);
33
+ });
34
+ const endIndex = computed(() => {
35
+ if (pageSize.value === -1) return total.value;
36
+ return Math.min(total.value, startIndex.value + pageSize.value);
37
+ });
38
+ const pageLength = computed(() => {
39
+ if (pageSize.value === -1 || total.value === 0) return 1;
40
+ return Math.ceil(total.value / pageSize.value);
41
+ });
42
+ watchEffect(() => {
43
+ if (page.value > pageLength.value) {
44
+ page.value = pageLength.value;
45
+ }
46
+ });
47
+ function setPageSize(value) {
48
+ pageSize.value = value;
49
+ page.value = 1;
50
+ }
51
+ function nextPage() {
52
+ page.value = clamp(page.value + 1, 1, pageLength.value);
53
+ }
54
+ function prevPage() {
55
+ page.value = clamp(page.value - 1, 1, pageLength.value);
56
+ }
57
+ function setPage(value) {
58
+ page.value = clamp(value, 1, pageLength.value);
59
+ }
60
+ const data = {
61
+ page,
62
+ pageSize,
63
+ startIndex,
64
+ endIndex,
65
+ pageLength,
66
+ total,
67
+ nextPage,
68
+ prevPage,
69
+ setPage,
70
+ setPageSize
71
+ };
72
+ provide(Y_DATA_TABLE_PAGINATION_KEY, data);
73
+ return data;
74
+ }
75
+ export function usePagination() {
76
+ const data = inject(Y_DATA_TABLE_PAGINATION_KEY);
77
+ if (!data) {
78
+ throw new Error(`Not provided: ${Y_DATA_TABLE_PAGINATION_KEY.description}`);
79
+ }
80
+ return data;
81
+ }
82
+ //# sourceMappingURL=pagination.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.mjs","names":["computed","inject","provide","watchEffect","useModelDuplex","clamp","propsFactory","Y_DATA_TABLE_PAGINATION_KEY","Symbol","for","pressDataTablePaginationProps","page","type","Number","String","default","pageSize","createPagination","props","undefined","value","providePagination","options","total","startIndex","endIndex","Math","min","pageLength","ceil","setPageSize","nextPage","prevPage","setPage","data","usePagination","Error","description"],"sources":["../../../../src/components/table/composibles/pagination.ts"],"sourcesContent":["import type { InjectionKey, PropType, Ref } from 'vue';\nimport { computed, inject, provide, watchEffect } from 'vue';\n\nimport { useModelDuplex } from '../../../composables/communication';\nimport { clamp } from '../../../util/common';\nimport { propsFactory } from '../../../util/vue-component';\nimport { DataTableProvidePaginationData } from \"../types\";\n\nexport const Y_DATA_TABLE_PAGINATION_KEY: InjectionKey<{\n page: Ref<number>;\n pageSize: Ref<number>;\n startIndex: Ref<number>;\n endIndex: Ref<number>;\n pageLength: Ref<number>;\n total: Ref<number>;\n prevPage: () => void;\n nextPage: () => void;\n setPage: (page: number) => void;\n setPageSize: (size: number) => void;\n}> = Symbol.for('yuyeon.data-table.pagination');\n\nexport const pressDataTablePaginationProps = propsFactory(\n {\n page: {\n type: [Number, String] as PropType<number | string>,\n default: 0,\n },\n pageSize: {\n type: [Number, String] as PropType<number | string>,\n default: 10,\n },\n },\n 'YDataTable--pagination',\n);\n\ntype PaginationProps = {\n page: number | string;\n 'onUpdate:page': ((v: any) => void) | undefined;\n pageSize: number | string;\n 'onUpdate:pageSize': ((v: any) => void) | undefined;\n total?: number | string;\n};\n\nexport function createPagination(props: PaginationProps) {\n const page = useModelDuplex(\n props,\n 'page',\n undefined,\n (value) => +(value ?? 0),\n );\n const pageSize = useModelDuplex(\n props,\n 'pageSize',\n undefined,\n (value) => +(value ?? 10),\n );\n return { page, pageSize };\n}\n\nexport function providePagination(options: {\n page: Ref<number>;\n pageSize: Ref<number>;\n total: Ref<number>;\n}) {\n const { page, pageSize, total } = options;\n\n const startIndex = computed(() => {\n if (pageSize.value === -1) return 0;\n\n return pageSize.value * (page.value - 1);\n });\n const endIndex = computed(() => {\n if (pageSize.value === -1) return total.value;\n\n return Math.min(total.value, startIndex.value + pageSize.value);\n });\n\n const pageLength = computed(() => {\n if (pageSize.value === -1 || total.value === 0) return 1;\n\n return Math.ceil(total.value / pageSize.value);\n });\n\n watchEffect(() => {\n if (page.value > pageLength.value) {\n page.value = pageLength.value;\n }\n });\n\n function setPageSize(value: number) {\n pageSize.value = value;\n page.value = 1;\n }\n\n function nextPage() {\n page.value = clamp(page.value + 1, 1, pageLength.value);\n }\n\n function prevPage() {\n page.value = clamp(page.value - 1, 1, pageLength.value);\n }\n\n function setPage(value: number) {\n page.value = clamp(value, 1, pageLength.value);\n }\n\n const data: DataTableProvidePaginationData = {\n page,\n pageSize,\n startIndex,\n endIndex,\n pageLength,\n total,\n nextPage,\n prevPage,\n setPage,\n setPageSize,\n };\n\n provide(Y_DATA_TABLE_PAGINATION_KEY, data);\n\n return data;\n}\n\nexport function usePagination() {\n const data = inject(Y_DATA_TABLE_PAGINATION_KEY);\n if (!data) {\n throw new Error(`Not provided: ${Y_DATA_TABLE_PAGINATION_KEY.description}`);\n }\n return data;\n}\n"],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import { computed, inject, provide } from 'vue';
2
+ import { useModelDuplex } from "../../../composables/communication.mjs";
3
+ import { wrapInArray } from "../../../util/array.mjs";
4
+ import { propsFactory } from "../../../util/vue-component.mjs";
5
+ export const pressDataTableSelectionProps = propsFactory({
6
+ enableSelect: Boolean,
7
+ selectStrategy: {
8
+ type: [String, Object],
9
+ default: 'page'
10
+ },
11
+ modelValue: {
12
+ type: Array,
13
+ default: () => []
14
+ }
15
+ }, 'YDataTable--selection');
16
+ const singleSelectStrategy = {
17
+ showSelectAll: false,
18
+ allSelected: () => [],
19
+ select: _ref => {
20
+ let {
21
+ items,
22
+ value
23
+ } = _ref;
24
+ return new Set(value ? [items[0]?.value] : []);
25
+ },
26
+ selectAll: _ref2 => {
27
+ let {
28
+ selected
29
+ } = _ref2;
30
+ return selected;
31
+ }
32
+ };
33
+ const pageSelectStrategy = {
34
+ showSelectAll: true,
35
+ allSelected: _ref3 => {
36
+ let {
37
+ pageItems
38
+ } = _ref3;
39
+ return pageItems;
40
+ },
41
+ select: _ref4 => {
42
+ let {
43
+ items,
44
+ value,
45
+ selected
46
+ } = _ref4;
47
+ for (const item of items) {
48
+ if (value) selected.add(item.value);else selected.delete(item.value);
49
+ }
50
+ return selected;
51
+ },
52
+ selectAll: _ref5 => {
53
+ let {
54
+ value,
55
+ pageItems,
56
+ selected
57
+ } = _ref5;
58
+ return pageSelectStrategy.select({
59
+ items: pageItems,
60
+ value,
61
+ selected
62
+ });
63
+ }
64
+ };
65
+ const allSelectStrategy = {
66
+ showSelectAll: true,
67
+ allSelected: _ref6 => {
68
+ let {
69
+ allItems
70
+ } = _ref6;
71
+ return allItems;
72
+ },
73
+ select: _ref7 => {
74
+ let {
75
+ items,
76
+ value,
77
+ selected
78
+ } = _ref7;
79
+ for (const item of items) {
80
+ if (value) selected.add(item.value);else selected.delete(item.value);
81
+ }
82
+ return selected;
83
+ },
84
+ selectAll: _ref8 => {
85
+ let {
86
+ value,
87
+ allItems,
88
+ selected
89
+ } = _ref8;
90
+ return allSelectStrategy.select({
91
+ items: allItems,
92
+ value,
93
+ selected
94
+ });
95
+ }
96
+ };
97
+ export const Y_DATA_TABLE_SELECTION_KEY = Symbol.for('yuyeon.data-table.selection');
98
+ export function provideSelection(props, _ref9) {
99
+ let {
100
+ allItems,
101
+ pageItems
102
+ } = _ref9;
103
+ const selected = useModelDuplex(props, 'modelValue', props.modelValue, v => {
104
+ return new Set(v);
105
+ }, v => {
106
+ return [...v.values()];
107
+ });
108
+ const allSelectables = computed(() => allItems.value.filter(item => item.selectable));
109
+ const pageSelectables = computed(() => pageItems.value.filter(item => item.selectable));
110
+ const selectStrategy = computed(() => {
111
+ if (typeof props.selectStrategy === 'object') {
112
+ return props.selectStrategy;
113
+ }
114
+ switch (props.selectStrategy) {
115
+ case 'single':
116
+ return singleSelectStrategy;
117
+ case 'all':
118
+ return allSelectStrategy;
119
+ case 'page':
120
+ default:
121
+ return pageSelectStrategy;
122
+ }
123
+ });
124
+ function isSelected(items) {
125
+ return wrapInArray(items).every(item => selected.value.has(item.value));
126
+ }
127
+ function isSomeSelected(items) {
128
+ return wrapInArray(items).some(item => selected.value.has(item.value));
129
+ }
130
+ function select(items, value) {
131
+ selected.value = selectStrategy.value.select({
132
+ items,
133
+ value,
134
+ selected: new Set(selected.value)
135
+ });
136
+ }
137
+ function toggleSelect(item) {
138
+ select([item], !isSelected([item]));
139
+ }
140
+ function selectAll(value) {
141
+ selected.value = selectStrategy.value.selectAll({
142
+ value,
143
+ allItems: allSelectables.value,
144
+ pageItems: pageSelectables.value,
145
+ selected: new Set(selected.value)
146
+ });
147
+ }
148
+ const selectables = computed(() => {
149
+ return selectStrategy.value.allSelected({
150
+ allItems: allSelectables.value,
151
+ pageItems: pageSelectables.value
152
+ });
153
+ });
154
+ const someSelected = computed(() => selected.value.size > 0);
155
+ const allSelected = computed(() => {
156
+ return isSelected(selectables.value);
157
+ });
158
+ const data = {
159
+ toggleSelect,
160
+ select,
161
+ selectAll,
162
+ isSelected,
163
+ isSomeSelected,
164
+ someSelected,
165
+ allSelected,
166
+ showSelectAll: selectStrategy.value.showSelectAll,
167
+ selectables
168
+ };
169
+ provide(Y_DATA_TABLE_SELECTION_KEY, data);
170
+ return data;
171
+ }
172
+ export function useSelection() {
173
+ const data = inject(Y_DATA_TABLE_SELECTION_KEY);
174
+ if (!data) {
175
+ throw new Error(`Not provided: ${Y_DATA_TABLE_SELECTION_KEY.description}`);
176
+ }
177
+ return data;
178
+ }
179
+ //# sourceMappingURL=selection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.mjs","names":["computed","inject","provide","useModelDuplex","wrapInArray","propsFactory","pressDataTableSelectionProps","enableSelect","Boolean","selectStrategy","type","String","Object","default","modelValue","Array","singleSelectStrategy","showSelectAll","allSelected","select","_ref","items","value","Set","selectAll","_ref2","selected","pageSelectStrategy","_ref3","pageItems","_ref4","item","add","delete","_ref5","allSelectStrategy","_ref6","allItems","_ref7","_ref8","Y_DATA_TABLE_SELECTION_KEY","Symbol","for","provideSelection","props","_ref9","v","values","allSelectables","filter","selectable","pageSelectables","isSelected","every","has","isSomeSelected","some","toggleSelect","selectables","someSelected","size","data","useSelection","Error","description"],"sources":["../../../../src/components/table/composibles/selection.ts"],"sourcesContent":["import { InjectionKey, PropType, Ref, computed, inject, provide } from 'vue';\n\nimport { useModelDuplex } from '../../../composables/communication';\nimport { wrapInArray } from '../../../util/array';\nimport { propsFactory } from '../../../util/vue-component';\n\nimport { DataTableProvideSelectionData } from '../types';\nimport { DataTableItemsProps } from './items';\n\nexport interface SelectableItem {\n value: any;\n selectable: boolean;\n}\n\nexport interface DataTableSelectStrategy {\n showSelectAll: boolean;\n allSelected: (data: {\n allItems: SelectableItem[];\n pageItems: SelectableItem[];\n }) => SelectableItem[];\n select: (data: {\n items: SelectableItem[];\n value: boolean;\n selected: Set<unknown>;\n }) => Set<unknown>;\n selectAll: (data: {\n value: boolean;\n allItems: SelectableItem[];\n pageItems: SelectableItem[];\n selected: Set<unknown>;\n }) => Set<unknown>;\n}\n\nexport const pressDataTableSelectionProps = propsFactory(\n {\n enableSelect: Boolean,\n selectStrategy: {\n type: [String, Object] as PropType<'single' | 'page' | 'all'>,\n default: 'page',\n },\n modelValue: {\n type: Array as PropType<readonly any[]>,\n default: () => [],\n },\n },\n 'YDataTable--selection',\n);\n\ntype DataTableSelectionProps = Pick<DataTableItemsProps, 'itemKey'> & {\n modelValue: readonly any[];\n selectStrategy: 'single' | 'page' | 'all';\n 'onUpdate:modelValue': ((value: any[]) => void) | undefined;\n};\n\nconst singleSelectStrategy: DataTableSelectStrategy = {\n showSelectAll: false,\n allSelected: () => [],\n select: ({ items, value }) => {\n return new Set(value ? [items[0]?.value] : []);\n },\n selectAll: ({ selected }) => selected,\n};\n\nconst pageSelectStrategy: DataTableSelectStrategy = {\n showSelectAll: true,\n allSelected: ({ pageItems }) => pageItems,\n select: ({ items, value, selected }) => {\n for (const item of items) {\n if (value) selected.add(item.value);\n else selected.delete(item.value);\n }\n\n return selected;\n },\n selectAll: ({ value, pageItems, selected }) =>\n pageSelectStrategy.select({ items: pageItems, value, selected }),\n};\n\nconst allSelectStrategy: DataTableSelectStrategy = {\n showSelectAll: true,\n allSelected: ({ allItems }) => allItems,\n select: ({ items, value, selected }) => {\n for (const item of items) {\n if (value) selected.add(item.value);\n else selected.delete(item.value);\n }\n\n return selected;\n },\n selectAll: ({ value, allItems, selected }) =>\n allSelectStrategy.select({ items: allItems, value, selected }),\n};\n\nexport const Y_DATA_TABLE_SELECTION_KEY: InjectionKey<\n ReturnType<typeof provideSelection>\n> = Symbol.for('yuyeon.data-table.selection');\n\nexport function provideSelection(\n props: DataTableSelectionProps,\n {\n allItems,\n pageItems,\n }: { allItems: Ref<SelectableItem[]>; pageItems: Ref<SelectableItem[]> },\n) {\n const selected = useModelDuplex(\n props,\n 'modelValue',\n props.modelValue,\n (v) => {\n return new Set(v);\n },\n (v) => {\n return [...v.values()];\n },\n );\n\n const allSelectables = computed(() =>\n allItems.value.filter((item) => item.selectable),\n );\n\n const pageSelectables = computed(() =>\n pageItems.value.filter((item) => item.selectable),\n );\n\n const selectStrategy = computed(() => {\n if (typeof props.selectStrategy === 'object') {\n return props.selectStrategy;\n }\n switch (props.selectStrategy) {\n case 'single':\n return singleSelectStrategy;\n case 'all':\n return allSelectStrategy;\n case 'page':\n default:\n return pageSelectStrategy;\n }\n });\n\n function isSelected(items: SelectableItem | SelectableItem[]) {\n return wrapInArray(items).every((item) => selected.value.has(item.value));\n }\n\n function isSomeSelected(items: SelectableItem | SelectableItem[]) {\n return wrapInArray(items).some((item) => selected.value.has(item.value));\n }\n\n function select(items: SelectableItem[], value: boolean) {\n selected.value = selectStrategy.value.select({\n items,\n value,\n selected: new Set(selected.value),\n });\n }\n\n function toggleSelect(item: SelectableItem) {\n select([item], !isSelected([item]));\n }\n\n function selectAll(value: boolean) {\n selected.value = selectStrategy.value.selectAll({\n value,\n allItems: allSelectables.value,\n pageItems: pageSelectables.value,\n selected: new Set(selected.value),\n });\n }\n\n const selectables = computed(() => {\n return selectStrategy.value.allSelected({\n allItems: allSelectables.value,\n pageItems: pageSelectables.value,\n });\n });\n\n const someSelected = computed(() => selected.value.size > 0);\n\n const allSelected = computed(() => {\n return isSelected(selectables.value);\n });\n\n const data: DataTableProvideSelectionData = {\n toggleSelect,\n select,\n selectAll,\n isSelected,\n isSomeSelected,\n someSelected,\n allSelected,\n showSelectAll: selectStrategy.value.showSelectAll,\n selectables,\n };\n\n provide(Y_DATA_TABLE_SELECTION_KEY, data);\n\n return data;\n}\n\nexport function useSelection() {\n const data = inject(Y_DATA_TABLE_SELECTION_KEY);\n if (!data) {\n throw new Error(`Not provided: ${Y_DATA_TABLE_SELECTION_KEY.description}`);\n }\n\n return data;\n}\n"],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { toRef } from '@vue/runtime-core';
2
+ import { inject, provide } from 'vue';
3
+ import { useModelDuplex } from "../../../composables/communication.mjs";
4
+ import { propsFactory } from "../../../util/vue-component.mjs";
5
+ const Y_DATA_TABLE_SORTING_KEY = Symbol.for('yuyeon.data-table.sorting');
6
+ export const pressDataTableSortProps = propsFactory({
7
+ sortBy: {
8
+ type: Array,
9
+ default: () => []
10
+ },
11
+ multiSort: Boolean
12
+ }, 'YDataTable--sorting');
13
+ export function createSorting(props) {
14
+ const sortBy = useModelDuplex(props, 'sortBy');
15
+ const multiSort = toRef(props, 'multiSort');
16
+ return {
17
+ sortBy,
18
+ multiSort
19
+ };
20
+ }
21
+ export function provideSorting(options) {
22
+ const {
23
+ sortBy,
24
+ multiSort,
25
+ page
26
+ } = options;
27
+ const toggleSort = column => {
28
+ let neo = sortBy.value?.map(v => ({
29
+ ...v
30
+ })) ?? [];
31
+ const target = neo.find(v => v.key === column.key);
32
+ const sortOption = {
33
+ key: column.key,
34
+ order: 'asc'
35
+ };
36
+ if (!target) {
37
+ if (multiSort?.value) {
38
+ neo = [...neo, sortOption];
39
+ } else {
40
+ neo = [sortOption];
41
+ }
42
+ } else if (target.order === 'desc') {
43
+ if (column.mustSort) {
44
+ target.order = 'asc';
45
+ } else {
46
+ neo = neo.filter(v => v.key !== column.key);
47
+ }
48
+ } else {
49
+ target.order = 'desc';
50
+ }
51
+ sortBy.value = neo;
52
+ if (page) {
53
+ page.value = 1;
54
+ }
55
+ };
56
+ function isSorted(column) {
57
+ return !!sortBy.value.find(option => option.key === column.key);
58
+ }
59
+ const data = {
60
+ sortBy,
61
+ toggleSort,
62
+ isSorted
63
+ };
64
+ provide(Y_DATA_TABLE_SORTING_KEY, data);
65
+ return data;
66
+ }
67
+ export function useSorting() {
68
+ const data = inject(Y_DATA_TABLE_SORTING_KEY);
69
+ if (!data) {
70
+ throw new Error(`Not provided: ${Y_DATA_TABLE_SORTING_KEY.description}`);
71
+ }
72
+ return data;
73
+ }
74
+ //# sourceMappingURL=sorting.mjs.map