@bexis2/bexis2-core-ui 0.0.22 → 0.0.25

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 (86) hide show
  1. package/README.md +14 -33
  2. package/dist/TableView.svelte +1 -1
  3. package/dist/components/ListView.svelte +5 -5
  4. package/dist/components/Table/Table.svelte +167 -0
  5. package/dist/components/Table/Table.svelte.d.ts +17 -0
  6. package/dist/components/Table/TableFilter.svelte +168 -0
  7. package/dist/components/Table/TableFilter.svelte.d.ts +21 -0
  8. package/dist/components/Table/TablePagination.svelte +60 -0
  9. package/dist/components/Table/TablePagination.svelte.d.ts +17 -0
  10. package/dist/components/Table/filter.d.ts +4 -0
  11. package/dist/components/Table/filter.js +83 -0
  12. package/dist/components/file/FileIcon.svelte +45 -0
  13. package/dist/components/file/FileInfo.svelte +13 -0
  14. package/dist/components/{File → file}/FileUploader.svelte +35 -38
  15. package/dist/components/form/Checkbox.svelte +21 -0
  16. package/dist/components/form/Checkbox.svelte.d.ts +24 -0
  17. package/dist/components/form/CheckboxKvPList.svelte +18 -0
  18. package/dist/components/form/CheckboxKvPList.svelte.d.ts +20 -0
  19. package/dist/components/form/CheckboxList.svelte +18 -0
  20. package/dist/components/form/CheckboxList.svelte.d.ts +20 -0
  21. package/dist/components/form/DateInput.svelte +21 -0
  22. package/dist/components/form/DateInput.svelte.d.ts +24 -0
  23. package/dist/components/form/DropdownKvP.svelte +44 -0
  24. package/dist/components/form/DropdownKvP.svelte.d.ts +43 -0
  25. package/dist/components/form/InputContainer.svelte +21 -0
  26. package/dist/components/form/InputContainer.svelte.d.ts +20 -0
  27. package/dist/components/form/MultiSelect.svelte +89 -0
  28. package/dist/components/form/MultiSelect.svelte.d.ts +41 -0
  29. package/dist/components/form/NumberInput.svelte +21 -0
  30. package/dist/components/form/NumberInput.svelte.d.ts +24 -0
  31. package/dist/components/form/TextArea.svelte +20 -0
  32. package/dist/components/form/TextArea.svelte.d.ts +24 -0
  33. package/dist/components/form/TextInput.svelte +21 -0
  34. package/dist/components/form/TextInput.svelte.d.ts +24 -0
  35. package/dist/components/spinner/Spinner.svelte +9 -0
  36. package/dist/css/core.ui.css +5 -2
  37. package/dist/css/themes/theme-bexis2.css +96 -98
  38. package/dist/css/themes/theme-crimson.css +3 -2
  39. package/dist/css/themes/theme-hamlindigo.css +3 -2
  40. package/dist/css/themes/theme-seafoam.css +3 -2
  41. package/dist/index.d.ts +16 -5
  42. package/dist/index.js +20 -5
  43. package/dist/models/Models.d.ts +28 -0
  44. package/dist/services/Api.js +12 -11
  45. package/dist/stores/apistore.js +13 -13
  46. package/package.json +101 -85
  47. package/src/lib/TableView.svelte +1 -1
  48. package/src/lib/components/ListView.svelte +11 -13
  49. package/src/lib/components/Table/Table.svelte +184 -0
  50. package/src/lib/components/Table/TableFilter.svelte +176 -0
  51. package/src/lib/components/Table/TablePagination.svelte +61 -0
  52. package/src/lib/components/Table/filter.ts +94 -0
  53. package/src/lib/components/file/FileIcon.svelte +45 -0
  54. package/src/lib/components/file/FileInfo.svelte +13 -0
  55. package/src/lib/components/file/FileUploader.svelte +184 -0
  56. package/src/lib/components/form/Checkbox.svelte +24 -0
  57. package/src/lib/components/form/CheckboxKvPList.svelte +21 -0
  58. package/src/lib/components/form/CheckboxList.svelte +21 -0
  59. package/src/lib/components/form/DateInput.svelte +24 -0
  60. package/src/lib/components/form/DropdownKvP.svelte +44 -0
  61. package/src/lib/components/form/InputContainer.svelte +22 -0
  62. package/src/lib/components/form/MultiSelect.svelte +89 -0
  63. package/src/lib/components/form/NumberInput.svelte +24 -0
  64. package/src/lib/components/form/TextArea.svelte +23 -0
  65. package/src/lib/components/form/TextInput.svelte +24 -0
  66. package/src/lib/components/spinner/Spinner.svelte +9 -0
  67. package/src/lib/css/core.ui.css +5 -2
  68. package/src/lib/css/themes/theme-bexis2.css +96 -98
  69. package/src/lib/css/themes/theme-crimson.css +3 -2
  70. package/src/lib/css/themes/theme-hamlindigo.css +3 -2
  71. package/src/lib/css/themes/theme-seafoam.css +3 -2
  72. package/src/lib/index.ts +40 -11
  73. package/src/lib/models/Models.ts +70 -39
  74. package/src/lib/services/Api.ts +55 -58
  75. package/src/lib/stores/apistore.ts +28 -32
  76. package/dist/components/File/FileIcon.svelte +0 -49
  77. package/dist/components/File/FileInfo.svelte +0 -14
  78. package/dist/components/Spinner/Spinner.svelte +0 -8
  79. package/src/lib/components/File/FileIcon.svelte +0 -49
  80. package/src/lib/components/File/FileInfo.svelte +0 -14
  81. package/src/lib/components/File/FileUploader.svelte +0 -217
  82. package/src/lib/components/Spinner/Spinner.svelte +0 -8
  83. /package/dist/components/{File → file}/FileIcon.svelte.d.ts +0 -0
  84. /package/dist/components/{File → file}/FileInfo.svelte.d.ts +0 -0
  85. /package/dist/components/{File → file}/FileUploader.svelte.d.ts +0 -0
  86. /package/dist/components/{Spinner → spinner}/Spinner.svelte.d.ts +0 -0
@@ -1,13 +1,11 @@
1
- <script lang="ts">
2
-
3
- type x={
4
- name:string
5
- }
6
-
7
- let result:x = {name:"david"}
8
-
9
- </script>
10
-
11
- <h1>MyList</h1>
12
- {result.name}
13
- <b>from bexis-lib</b>
1
+ <script lang="ts">
2
+ type x = {
3
+ name: string;
4
+ };
5
+
6
+ let result: x = { name: 'david' };
7
+ </script>
8
+
9
+ <h1>MyList</h1>
10
+ {result.name}
11
+ <b>from bexis-lib</b>
@@ -0,0 +1,184 @@
1
+ <script lang="ts">
2
+ import { createTable, Subscribe, Render, createRender } from 'svelte-headless-table';
3
+ import {
4
+ addSortBy,
5
+ addPagination,
6
+ addExpandedRows,
7
+ addColumnFilters,
8
+ addTableFilter
9
+ } from 'svelte-headless-table/plugins';
10
+
11
+ import TableFilter from './TableFilter.svelte';
12
+ import TablePagination from './TablePagination.svelte';
13
+ import { columnFilter, searchFilter } from './filter';
14
+ import type { TableConfig } from '$lib/models/Models';
15
+
16
+ export let config: TableConfig<any>;
17
+ let {
18
+ id: tableId,
19
+ data,
20
+ columns,
21
+ optionsComponent,
22
+ defaultPageSize = 10,
23
+ pageSizes = [5, 10, 15, 20]
24
+ } = config;
25
+
26
+ type AccessorType = keyof (typeof $data)[0];
27
+
28
+ const table = createTable(data, {
29
+ colFilter: addColumnFilters(),
30
+ tableFilter: addTableFilter({
31
+ fn: searchFilter
32
+ }),
33
+ sort: addSortBy({ disableMultiSort: true }),
34
+ page: addPagination({ initialPageSize: defaultPageSize }),
35
+ expand: addExpandedRows()
36
+ });
37
+
38
+ const accessors: AccessorType[] = Object.keys($data[0]) as AccessorType[];
39
+
40
+ const tableColumns = [
41
+ ...accessors
42
+ .filter((accessor) => {
43
+ const key = accessor as string;
44
+ if (columns !== undefined && key in columns && columns[key].exclude === true) {
45
+ return false;
46
+ }
47
+ return true;
48
+ })
49
+ .map((accessor) => {
50
+ const key = accessor as string;
51
+ if (columns !== undefined && key in columns) {
52
+ const { header, colFilterFn, colFilterComponent } = columns[key];
53
+ return table.column({
54
+ header: header ?? key,
55
+ accessor: accessor,
56
+ plugins: {
57
+ sort: { invert: true },
58
+ colFilter: {
59
+ fn: colFilterFn ?? columnFilter,
60
+ render: ({ filterValue, values, id }) =>
61
+ createRender(colFilterComponent ?? TableFilter, {
62
+ filterValue,
63
+ values,
64
+ id,
65
+ tableId
66
+ })
67
+ }
68
+ }
69
+ });
70
+ } else {
71
+ return table.column({
72
+ header: key,
73
+ accessor: accessor,
74
+ plugins: {
75
+ sort: { invert: true },
76
+ colFilter: {
77
+ fn: columnFilter,
78
+ render: ({ filterValue, values, id }) =>
79
+ createRender(TableFilter, { filterValue, values, id, tableId })
80
+ }
81
+ }
82
+ });
83
+ }
84
+ })
85
+ ];
86
+
87
+ if (optionsComponent !== undefined) {
88
+ tableColumns.push(
89
+ table.display({
90
+ id: 'options',
91
+ header: '',
92
+ cell: ({ row }, _) => {
93
+ return createRender(optionsComponent!, {
94
+ row: row.isData() ? row.original : null
95
+ });
96
+ }
97
+ }) as any
98
+ );
99
+ }
100
+
101
+ const createdTableColumns = table.createColumns(tableColumns);
102
+
103
+ const { headerRows, pageRows, tableAttrs, tableBodyAttrs, pluginStates } =
104
+ table.createViewModel(createdTableColumns);
105
+ const { filterValue } = pluginStates.tableFilter;
106
+ </script>
107
+
108
+ <div class="grid gap-2">
109
+ <div class="table-container">
110
+ <input
111
+ class="input p-2 mb-2 border border-primary-500"
112
+ type="text"
113
+ bind:value={$filterValue}
114
+ placeholder="Search rows..."
115
+ />
116
+ <table {...$tableAttrs} class="table table-compact bg-tertiary-200">
117
+ <thead>
118
+ {#each $headerRows as headerRow (headerRow.id)}
119
+ <Subscribe
120
+ rowAttrs={headerRow.attrs()}
121
+ let:rowAttrs
122
+ rowProps={headerRow.props()}
123
+ let:rowProps
124
+ >
125
+ <tr {...rowAttrs} class="bg-primary-300">
126
+ {#each headerRow.cells as cell (cell.id)}
127
+ <Subscribe attrs={cell.attrs()} props={cell.props()} let:props let:attrs>
128
+ <th scope="col" class="!p-2" {...attrs}>
129
+ <div class="flex w-full justify-between items-center">
130
+ <div class="flex gap-1">
131
+ <span
132
+ class:underline={props.sort.order}
133
+ class:normal-case={cell.id !== cell.label}
134
+ on:click={props.sort.toggle}
135
+ on:keydown={props.sort.toggle}
136
+ >
137
+ {cell.render()}
138
+ </span>
139
+ <div class="w-2">
140
+ {#if props.sort.order === 'asc'}
141
+
142
+ {:else if props.sort.order === 'desc'}
143
+
144
+ {/if}
145
+ </div>
146
+ </div>
147
+ {#if cell.isData()}
148
+ {#if props.colFilter?.render}
149
+ <div>
150
+ <Render of={props.colFilter.render} />
151
+ </div>
152
+ {/if}
153
+ {/if}
154
+ </div>
155
+ </th>
156
+ </Subscribe>
157
+ {/each}
158
+ </tr>
159
+ </Subscribe>
160
+ {/each}
161
+ </thead>
162
+
163
+ <tbody class="" {...$tableBodyAttrs}>
164
+ {#each $pageRows as row (row.id)}
165
+ <Subscribe rowAttrs={row.attrs()} let:rowAttrs>
166
+ <tr {...rowAttrs}>
167
+ {#each row.cells as cell (cell?.id)}
168
+ <Subscribe attrs={cell.attrs()} let:attrs>
169
+ <td {...attrs} class="!p-2">
170
+ <div class="flex items-center w-full h-full table-cell-fit">
171
+ <Render of={cell.render()} />
172
+ </div>
173
+ </td>
174
+ </Subscribe>
175
+ {/each}
176
+ </tr>
177
+ </Subscribe>
178
+ {/each}
179
+ </tbody>
180
+ </table>
181
+ </div>
182
+
183
+ <TablePagination pageConfig={pluginStates.page} {pageSizes} />
184
+ </div>
@@ -0,0 +1,176 @@
1
+ <script lang="ts">
2
+ import Fa from 'svelte-fa/src/fa.svelte';
3
+ import { faFilter } from '@fortawesome/free-solid-svg-icons';
4
+ import { popup } from '@skeletonlabs/skeleton';
5
+ import type { PopupSettings } from '@skeletonlabs/skeleton';
6
+
7
+ export let filterValue;
8
+ export let values;
9
+ export let id;
10
+ export let tableId;
11
+
12
+ let firstOption;
13
+ let firstValue;
14
+ let secondOption;
15
+ let secondValue;
16
+ let active = false;
17
+
18
+ const options = {
19
+ number: [
20
+ {
21
+ value: 'isequal',
22
+ label: 'Is equal to'
23
+ },
24
+ {
25
+ value: 'isgreaterorequal',
26
+ label: 'Is greater than or equal to'
27
+ },
28
+ {
29
+ value: 'isgreater',
30
+ label: 'Is greater than'
31
+ },
32
+ {
33
+ value: 'islessorequal',
34
+ label: 'Is less than or equal to'
35
+ },
36
+ {
37
+ value: 'isless',
38
+ label: 'Is less than'
39
+ },
40
+ {
41
+ value: 'isnotequal',
42
+ label: 'Is not equal to'
43
+ }
44
+ ],
45
+ string: [
46
+ {
47
+ value: 'isequal',
48
+ label: 'Is equal to'
49
+ },
50
+ {
51
+ value: 'isnotequal',
52
+ label: 'Is not equal to'
53
+ },
54
+ {
55
+ value: 'starts',
56
+ label: 'Starts with'
57
+ },
58
+ {
59
+ value: 'contains',
60
+ label: 'Contains'
61
+ },
62
+ {
63
+ value: 'notcontains',
64
+ label: 'Does not contain'
65
+ },
66
+ {
67
+ value: 'ends',
68
+ label: 'Ends with'
69
+ }
70
+ ]
71
+ };
72
+
73
+ const popupId = `${tableId}-${id}`;
74
+
75
+ const popupFeatured: PopupSettings = {
76
+ event: 'click',
77
+ target: popupId,
78
+ placement: 'bottom-start'
79
+ };
80
+
81
+ const type = typeof $values[0];
82
+ </script>
83
+
84
+ <form class="">
85
+ <button
86
+ class:variant-filled-primary={active}
87
+ class="btn w-max p-2"
88
+ type="button"
89
+ use:popup={popupFeatured}
90
+ >
91
+ <Fa icon={faFilter} size="12" />
92
+ </button>
93
+
94
+ <div data-popup={`${popupId}`}>
95
+ <div class="card p-3 absolute grid gap-2 shadow-lg z-10 w-min">
96
+ <button
97
+ class="btn variant-filled-primary btn-sm"
98
+ type="submit"
99
+ on:click={() => {
100
+ firstOption = 'isequal';
101
+ firstValue = undefined;
102
+ secondOption = 'isequal';
103
+ secondValue = undefined;
104
+
105
+ $filterValue = [firstOption, firstValue, secondOption, secondValue];
106
+ active = false;
107
+ }}>Clear Filter</button
108
+ >
109
+
110
+ <label for="" class="label normal-case text-sm">Show rows with value that</label>
111
+ <div class="grid gap-2 w-full">
112
+ <select
113
+ class="select border border-primary-500 text-sm p-1"
114
+ aria-label="Show rows with value that"
115
+ bind:value={firstOption}
116
+ on:click|stopPropagation
117
+ >
118
+ {#each options[type] as option (option)}
119
+ <option value={option.value}>{option.label}</option>
120
+ {/each}
121
+ </select>
122
+ {#if type === 'number'}
123
+ <input
124
+ type="number"
125
+ class="input p-1 border border-primary-500"
126
+ bind:value={firstValue}
127
+ on:click|stopPropagation
128
+ />
129
+ {:else}
130
+ <input
131
+ type="text"
132
+ class="input p-1 border border-primary-500"
133
+ bind:value={firstValue}
134
+ on:click|stopPropagation
135
+ />
136
+ {/if}
137
+ </div>
138
+ <label for="" class="label normal-case">And</label>
139
+ <div class="grid gap-2 w-max">
140
+ <select
141
+ class="select border border-primary-500 text-sm p-1"
142
+ aria-label="Show rows with value that"
143
+ bind:value={secondOption}
144
+ on:click|stopPropagation
145
+ >
146
+ {#each options[type] as option (option)}
147
+ <option value={option.value}>{option.label}</option>
148
+ {/each}
149
+ </select>
150
+ {#if type === 'number'}
151
+ <input
152
+ type="number"
153
+ class="input p-1 border border-primary-500"
154
+ bind:value={secondValue}
155
+ on:click|stopPropagation
156
+ />
157
+ {:else}
158
+ <input
159
+ type="text"
160
+ class="input p-1 border border-primary-500"
161
+ bind:value={secondValue}
162
+ on:click|stopPropagation
163
+ />
164
+ {/if}
165
+ </div>
166
+ <button
167
+ class="btn variant-filled-primary btn-sm"
168
+ type="submit"
169
+ on:click={() => {
170
+ active = firstValue?.toString().length > 0 || secondValue?.toString().length > 0;
171
+ $filterValue = [firstOption, firstValue, secondOption, secondValue];
172
+ }}>Submit</button
173
+ >
174
+ </div>
175
+ </div>
176
+ </form>
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import Fa from 'svelte-fa/src/fa.svelte';
3
+ import {
4
+ faAnglesRight,
5
+ faAngleRight,
6
+ faAnglesLeft,
7
+ faAngleLeft
8
+ } from '@fortawesome/free-solid-svg-icons';
9
+
10
+ export let pageConfig;
11
+ export let pageSizes;
12
+
13
+ const { pageIndex, pageCount, pageSize, hasNextPage, hasPreviousPage } = pageConfig;
14
+
15
+ const goToFirstPage = () => ($pageIndex = 0);
16
+ const goToLastPage = () => ($pageIndex = $pageCount - 1);
17
+ const goToNextPage = () => ($pageIndex += 1);
18
+ const goToPreviousPage = () => ($pageIndex -= 1);
19
+
20
+ $: goToFirstPageDisabled = !$pageIndex;
21
+ $: goToLastPageDisabled = $pageIndex == $pageCount - 1;
22
+ $: goToNextPageDisabled = !$hasNextPage;
23
+ $: goToPreviousPageDisabled = !$hasPreviousPage;
24
+ </script>
25
+
26
+ <div class="flex justify-center gap-1">
27
+ <button
28
+ class="btn btn-sm variant-filled-primary"
29
+ on:click={goToFirstPage}
30
+ disabled={goToFirstPageDisabled}
31
+ >
32
+ <Fa icon={faAnglesLeft} /></button
33
+ >
34
+ <button
35
+ class="btn btn-sm variant-filled-primary"
36
+ on:click={goToPreviousPage}
37
+ disabled={goToPreviousPageDisabled}><Fa icon={faAngleLeft} /></button
38
+ >
39
+
40
+ <select
41
+ name="pageSize"
42
+ id="pageSize"
43
+ class="select btn btn-sm variant-filled-primary w-min font-bold"
44
+ bind:value={$pageSize}
45
+ >
46
+ {#each pageSizes as size}
47
+ <option value={size}>{size}</option>
48
+ {/each}
49
+ </select>
50
+
51
+ <button
52
+ class="btn btn-sm variant-filled-primary"
53
+ on:click={goToNextPage}
54
+ disabled={goToNextPageDisabled}><Fa icon={faAngleRight} /></button
55
+ >
56
+ <button
57
+ class="btn btn-sm variant-filled-primary"
58
+ on:click={goToLastPage}
59
+ disabled={goToLastPageDisabled}><Fa icon={faAnglesRight} /></button
60
+ >
61
+ </div>
@@ -0,0 +1,94 @@
1
+ import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
2
+ import type { TableFilterFn } from 'svelte-headless-table/lib/plugins/addTableFilter';
3
+
4
+ const textFilter = (filterOption, filterValue, value) => {
5
+ switch (filterOption) {
6
+ case 'isequal':
7
+ return value.toLowerCase() === filterValue.toLowerCase();
8
+ case 'isnotequal':
9
+ return value.toLowerCase() !== filterValue.toLowerCase();
10
+ case 'starts':
11
+ return value.toLowerCase().startsWith(filterValue.toLowerCase());
12
+ case 'ends':
13
+ return value.toLowerCase().endsWith(filterValue.toLowerCase());
14
+ case 'contains':
15
+ return value.toLowerCase().includes(filterValue.toLowerCase());
16
+ case 'notcontains':
17
+ return !value.toLowerCase().includes(filterValue.toLowerCase());
18
+ default:
19
+ return false;
20
+ }
21
+ };
22
+
23
+ const numberFilter = (filterOption, filterValue, value) => {
24
+ switch (filterOption) {
25
+ case 'isequal':
26
+ return value === filterValue;
27
+ case 'isnotequal':
28
+ return value !== filterValue;
29
+ case 'isgreater':
30
+ return value > filterValue;
31
+ case 'isless':
32
+ return value < filterValue;
33
+ case 'isgreaterorequal':
34
+ return value >= filterValue;
35
+ case 'islessorequal':
36
+ return value <= filterValue;
37
+ default:
38
+ return false;
39
+ }
40
+ };
41
+
42
+ const numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
43
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
44
+ if (!firstFilterValue && !secondFilterValue) {
45
+ return true;
46
+ } else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
47
+ return numberFilter(secondFilterOption, secondFilterValue, value);
48
+ } else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
49
+ return numberFilter(firstFilterOption, firstFilterValue, value);
50
+ }
51
+ return (
52
+ numberFilter(firstFilterOption, firstFilterValue, value) &&
53
+ numberFilter(secondFilterOption, secondFilterValue, value)
54
+ );
55
+ };
56
+
57
+ const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
58
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
59
+ if (!firstFilterValue?.length && !secondFilterValue?.length) {
60
+ return true;
61
+ } else if (
62
+ (!firstFilterOption || !firstFilterValue) &&
63
+ secondFilterOption &&
64
+ secondFilterValue?.length
65
+ ) {
66
+ return textFilter(secondFilterOption, secondFilterValue, value);
67
+ } else if (
68
+ (!secondFilterOption || !secondFilterValue?.length) &&
69
+ firstFilterOption &&
70
+ firstFilterValue?.length
71
+ ) {
72
+ return textFilter(firstFilterOption, firstFilterValue, value);
73
+ }
74
+ return (
75
+ textFilter(firstFilterOption, firstFilterValue, value) &&
76
+ textFilter(secondFilterOption, secondFilterValue, value)
77
+ );
78
+ };
79
+
80
+ export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
81
+ if (typeof value === 'string') {
82
+ return stringFilter({ filterValue, value });
83
+ } else if (typeof value === 'number') {
84
+ return numericFilter({ filterValue, value });
85
+ }
86
+ return false;
87
+ };
88
+
89
+ export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
90
+ if (value.toLowerCase().includes(filterValue.toLowerCase())) {
91
+ return true;
92
+ }
93
+ return false;
94
+ };
@@ -0,0 +1,45 @@
1
+ <script>
2
+ import Fa from 'svelte-fa';
3
+ import { faFileAudio } from '@fortawesome/free-regular-svg-icons';
4
+ import { faFileVideo } from '@fortawesome/free-regular-svg-icons';
5
+ import { faFileWord } from '@fortawesome/free-regular-svg-icons';
6
+ import { faFilePdf } from '@fortawesome/free-regular-svg-icons';
7
+ import { faFileExcel } from '@fortawesome/free-regular-svg-icons';
8
+ import { faFileAlt } from '@fortawesome/free-regular-svg-icons';
9
+ import { faFileImage } from '@fortawesome/free-regular-svg-icons';
10
+ import { faFileArchive } from '@fortawesome/free-regular-svg-icons';
11
+
12
+ export let type = '';
13
+ </script>
14
+
15
+ {#if type.includes('excel') || type.includes('spreadsheetml')}
16
+ <Fa icon={faFileExcel} />
17
+ {/if}
18
+
19
+ {#if type.includes('text')}
20
+ <Fa icon={faFileAlt} />
21
+ {/if}
22
+
23
+ {#if type.includes('image')}
24
+ <Fa icon={faFileImage} />
25
+ {/if}
26
+
27
+ {#if type.includes('audio')}
28
+ <Fa icon={faFileAudio} />
29
+ {/if}
30
+
31
+ {#if type.includes('video')}
32
+ <Fa icon={faFileVideo} />
33
+ {/if}
34
+
35
+ {#if type.includes('word')}
36
+ <Fa icon={faFileWord} />
37
+ {/if}
38
+
39
+ {#if type.includes('pdf')}
40
+ <Fa icon={faFilePdf} />
41
+ {/if}
42
+
43
+ {#if type.includes('zip')}
44
+ <Fa icon={faFileArchive} />
45
+ {/if}
@@ -0,0 +1,13 @@
1
+ <script>
2
+ import FileIcon from './FileIcon.svelte';
3
+
4
+ export let name = '';
5
+ export let type = '';
6
+ // export let description;
7
+ export let size = '';
8
+ </script>
9
+
10
+ <div style="font-size:{size}">
11
+ <FileIcon {type} />
12
+ {name}
13
+ </div>