@yimingliao/cms 0.0.146 → 0.0.148

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 (109) hide show
  1. package/dist/export/client/components/editor/index.js +2 -0
  2. package/dist/export/client/components/index.js +67 -0
  3. package/dist/src/client/applications/ui/use-parent-pathname.js +10 -0
  4. package/dist/src/client/interfaces/components/admin-initializer.js +29 -0
  5. package/dist/src/client/interfaces/components/resources/file/file-card.js +84 -0
  6. package/dist/src/client/interfaces/components/resources/file/file-list.js +156 -0
  7. package/dist/src/client/interfaces/components/resources/file/is-locked-buttons.js +68 -0
  8. package/dist/src/client/interfaces/components/resources/file/type-buttons.js +59 -0
  9. package/dist/src/client/interfaces/components/shadcn/sidebar.js +1 -1
  10. package/dist/src/client/interfaces/components/ui/blocks/list-cards-container/list-cards-container.js +84 -0
  11. package/dist/src/client/interfaces/components/ui/blocks/list-cards-container/page-size-selector.js +51 -0
  12. package/dist/src/client/interfaces/components/ui/blocks/list-cards-container/pagination.js +94 -0
  13. package/dist/src/client/interfaces/components/ui/blocks/page-header/page-header-title.js +26 -0
  14. package/dist/src/client/interfaces/components/ui/blocks/page-header/page-header.js +74 -0
  15. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/batch-create.js +33 -0
  16. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/batch.js +39 -0
  17. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/create.js +33 -0
  18. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/edit.js +33 -0
  19. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/index.js +48 -0
  20. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/show.js +61 -0
  21. package/dist/src/client/interfaces/components/ui/blocks/page-header/presets/trash.js +39 -0
  22. package/dist/src/client/interfaces/components/ui/buttons/return-button.js +61 -0
  23. package/dist/src/client/interfaces/components/ui/cards/action-buttons-card.js +82 -0
  24. package/dist/src/client/interfaces/components/ui/cards/resource-card/card-status-bar.js +51 -0
  25. package/dist/src/client/interfaces/components/ui/cards/resource-card/card-text-content.js +38 -0
  26. package/dist/src/client/interfaces/components/ui/cards/resource-card/resource-card.js +77 -0
  27. package/dist/src/client/interfaces/components/ui/display/array-list.js +69 -0
  28. package/dist/src/client/interfaces/components/ui/display/badge.js +41 -0
  29. package/dist/src/client/interfaces/components/ui/display/html-display.js +32 -0
  30. package/dist/src/client/interfaces/components/ui/display/object-array-list.js +75 -0
  31. package/dist/src/client/interfaces/components/ui/features/accordion/accordion-container.js +31 -0
  32. package/dist/src/client/interfaces/components/ui/features/accordion/accordion-header.js +34 -0
  33. package/dist/src/client/interfaces/components/ui/features/accordion/accordion.js +81 -0
  34. package/dist/src/client/interfaces/components/ui/features/expandable-list/expand-bar.js +39 -0
  35. package/dist/src/client/interfaces/components/ui/features/expandable-list/expandable-list-content.js +49 -0
  36. package/dist/src/client/interfaces/components/ui/features/expandable-list/expandable-list.js +53 -0
  37. package/dist/src/client/interfaces/components/ui/features/external-link.js +15 -0
  38. package/dist/src/client/interfaces/components/ui/features/file/file-info/file-info.js +118 -0
  39. package/dist/src/client/interfaces/components/ui/features/file/file-info/file-name.js +48 -0
  40. package/dist/src/client/interfaces/components/ui/features/file/file-picker/file-picker-container.js +74 -0
  41. package/dist/src/client/interfaces/components/ui/features/file/file-picker/file-picker-placeholder.js +48 -0
  42. package/dist/src/client/interfaces/components/ui/features/file/file-picker/file-picker.js +109 -0
  43. package/dist/src/client/interfaces/components/ui/features/file/file-preview/file-preview-list.js +85 -0
  44. package/dist/src/client/interfaces/components/ui/features/file/file-preview/file-preview-meta.js +40 -0
  45. package/dist/src/client/interfaces/components/ui/features/file/file-preview/file-preview.js +113 -0
  46. package/dist/src/client/interfaces/components/ui/features/file/uploader.js +101 -0
  47. package/dist/src/client/interfaces/components/ui/features/pick-modal/pick-modal-body.js +112 -0
  48. package/dist/src/client/interfaces/components/ui/features/pick-modal/pick-modal-trigger.js +97 -0
  49. package/dist/src/client/interfaces/components/ui/features/pick-modal/pick-modal.js +77 -0
  50. package/dist/src/client/interfaces/components/ui/features/smart-image.js +57 -0
  51. package/dist/src/client/interfaces/components/ui/features/tick.js +27 -0
  52. package/dist/src/client/interfaces/components/ui/form/containers/fields-container.js +24 -0
  53. package/dist/src/client/interfaces/components/ui/form/containers/main-fields.js +25 -0
  54. package/dist/src/client/interfaces/components/ui/form/containers/side-fields.js +24 -0
  55. package/dist/src/client/interfaces/components/ui/form/control-fields/built-in-fields.js +9 -0
  56. package/dist/src/client/interfaces/components/ui/form/control-fields/control-fields-display.js +112 -0
  57. package/dist/src/client/interfaces/components/ui/form/control-fields/control-fields-input.js +158 -0
  58. package/dist/src/client/interfaces/components/ui/form/control-fields/control-fields.js +59 -0
  59. package/dist/src/client/interfaces/components/ui/form/field-body.js +79 -0
  60. package/dist/src/client/interfaces/components/ui/form/index-field.js +87 -0
  61. package/dist/src/client/interfaces/components/ui/form/slug-field.js +82 -0
  62. package/dist/src/client/interfaces/components/ui/inputs/array-input.js +110 -0
  63. package/dist/src/client/interfaces/components/ui/inputs/checkbox.js +93 -0
  64. package/dist/src/client/interfaces/components/ui/inputs/editor/base/base-editor.js +144 -0
  65. package/dist/src/client/interfaces/components/ui/inputs/editor/base/built-in-plugins.js +71 -0
  66. package/dist/src/client/interfaces/components/ui/inputs/editor/base/configs/heading.config.js +41 -0
  67. package/dist/src/client/interfaces/components/ui/inputs/editor/base/configs/image.config.js +32 -0
  68. package/dist/src/client/interfaces/components/ui/inputs/editor/base/configs/table.config.js +15 -0
  69. package/dist/src/client/interfaces/components/ui/inputs/editor/editor.js +112 -0
  70. package/dist/src/client/interfaces/components/ui/inputs/editor/plugins/asset-manager/asset-manager.js +24 -0
  71. package/dist/src/client/interfaces/components/ui/inputs/editor/plugins/asset-manager/use-control-asset-mamager.js +26 -0
  72. package/dist/src/client/interfaces/components/ui/inputs/editor/plugins/file-repository/upload-adapter.js +84 -0
  73. package/dist/src/client/interfaces/components/ui/inputs/editor/plugins/word-count-display/icons.js +17 -0
  74. package/dist/src/client/interfaces/components/ui/inputs/editor/plugins/word-count-display/word-count-display.js +81 -0
  75. package/dist/src/client/interfaces/components/ui/inputs/editor/use-init-editor/use-init-editor.js +51 -0
  76. package/dist/src/client/interfaces/components/ui/inputs/search-input.js +61 -0
  77. package/dist/src/client/interfaces/components/ui/inputs/select.js +69 -0
  78. package/dist/src/client/interfaces/components/ui/inputs/textarea.js +62 -0
  79. package/dist/src/client/interfaces/components/ui/layouts/content-container.js +38 -0
  80. package/dist/src/client/interfaces/components/ui/layouts/navbar/i18n-selector.js +42 -0
  81. package/dist/src/client/interfaces/components/ui/layouts/navbar/nav-user.js +106 -0
  82. package/dist/src/client/interfaces/components/ui/layouts/navbar/navbar.js +84 -0
  83. package/dist/src/client/interfaces/components/ui/layouts/navbar/sign-out-button.js +58 -0
  84. package/dist/src/client/interfaces/components/ui/layouts/navbar/theme-selector.js +51 -0
  85. package/dist/src/client/interfaces/components/ui/layouts/sidebar/nav-main.js +99 -0
  86. package/dist/src/client/interfaces/pages/auth/change-password/page.js +3 -6
  87. package/dist/src/client/interfaces/pages/auth/email-unverified/page.js +0 -3
  88. package/dist/src/client/interfaces/pages/auth/forgot-password/page.js +3 -6
  89. package/dist/src/client/interfaces/pages/auth/layout.js +0 -3
  90. package/dist/src/client/interfaces/pages/auth/reset-password/page.js +3 -6
  91. package/dist/src/client/interfaces/pages/auth/sign-in/page.js +2 -5
  92. package/dist/src/client/interfaces/pages/dashboard/layout.js +0 -3
  93. package/dist/src/client/interfaces/styles/constants.js +3 -1
  94. package/dist/src/constants/file.js +27 -0
  95. package/dist/src/shared/list-items.js +3 -0
  96. package/dist/src/shared/utils/debounce.js +14 -0
  97. package/dist/types/export/client/components/editor/index.d.ts +2 -0
  98. package/dist/types/export/client/components/editor/index.d.ts.map +1 -0
  99. package/dist/types/export/client/components/index.d.ts +1 -1
  100. package/dist/types/export/client/components/index.d.ts.map +1 -1
  101. package/dist/types/src/client/interfaces/components/index.d.ts +1 -1
  102. package/dist/types/src/client/interfaces/components/index.d.ts.map +1 -1
  103. package/dist/types/src/client/interfaces/components/ui/index.d.ts +1 -1
  104. package/dist/types/src/client/interfaces/components/ui/index.d.ts.map +1 -1
  105. package/dist/types/src/client/interfaces/components/ui/inputs/editor/base/base-editor.d.ts.map +1 -1
  106. package/dist/types/src/client/interfaces/components/ui/inputs/editor/use-init-editor/use-init-editor.d.ts.map +1 -1
  107. package/dist/types/src/client/interfaces/components/ui/inputs/index.d.ts +0 -1
  108. package/dist/types/src/client/interfaces/components/ui/inputs/index.d.ts.map +1 -1
  109. package/package.json +6 -1
@@ -0,0 +1,2 @@
1
+ export { createEditor } from '../../../../src/client/interfaces/components/ui/inputs/editor/editor.js';
2
+ export { createUploadAdapter } from '../../../../src/client/interfaces/components/ui/inputs/editor/plugins/file-repository/upload-adapter.js';
@@ -0,0 +1,67 @@
1
+ export { createAdminInitializer } from '../../../src/client/interfaces/components/admin-initializer.js';
2
+ export { PageHeader } from '../../../src/client/interfaces/components/ui/blocks/page-header/page-header.js';
3
+ export { ListCardsContainer } from '../../../src/client/interfaces/components/ui/blocks/list-cards-container/list-cards-container.js';
4
+ export { Button } from '../../../src/client/interfaces/components/ui/buttons/button.js';
5
+ export { ReturnButton } from '../../../src/client/interfaces/components/ui/buttons/return-button.js';
6
+ export { ResourceCard } from '../../../src/client/interfaces/components/ui/cards/resource-card/resource-card.js';
7
+ export { ActionButtonsCard } from '../../../src/client/interfaces/components/ui/cards/action-buttons-card.js';
8
+ export { ArrayList } from '../../../src/client/interfaces/components/ui/display/array-list.js';
9
+ export { Badge } from '../../../src/client/interfaces/components/ui/display/badge.js';
10
+ export { HtmlDisplay } from '../../../src/client/interfaces/components/ui/display/html-display.js';
11
+ export { ObjectArrayList } from '../../../src/client/interfaces/components/ui/display/object-array-list.js';
12
+ export { Accordion } from '../../../src/client/interfaces/components/ui/features/accordion/accordion.js';
13
+ export { AccordionContainer } from '../../../src/client/interfaces/components/ui/features/accordion/accordion-container.js';
14
+ export { ExpandableList } from '../../../src/client/interfaces/components/ui/features/expandable-list/expandable-list.js';
15
+ export { createFileInfo } from '../../../src/client/interfaces/components/ui/features/file/file-info/file-info.js';
16
+ export { createFilePreview } from '../../../src/client/interfaces/components/ui/features/file/file-preview/file-preview.js';
17
+ export { createFilePreviewList } from '../../../src/client/interfaces/components/ui/features/file/file-preview/file-preview-list.js';
18
+ export { createFilePicker } from '../../../src/client/interfaces/components/ui/features/file/file-picker/file-picker.js';
19
+ export { createUploader } from '../../../src/client/interfaces/components/ui/features/file/uploader.js';
20
+ export { PickModal } from '../../../src/client/interfaces/components/ui/features/pick-modal/pick-modal.js';
21
+ export { ExternalLink } from '../../../src/client/interfaces/components/ui/features/external-link.js';
22
+ export { createSmartImage } from '../../../src/client/interfaces/components/ui/features/smart-image.js';
23
+ export { Tick } from '../../../src/client/interfaces/components/ui/features/tick.js';
24
+ export { Form } from '../../../src/client/interfaces/components/ui/form/form.js';
25
+ export { Field } from '../../../src/client/interfaces/components/ui/form/field.js';
26
+ export { FieldBody } from '../../../src/client/interfaces/components/ui/form/field-body.js';
27
+ export { FieldsContainer } from '../../../src/client/interfaces/components/ui/form/containers/fields-container.js';
28
+ export { MainFields } from '../../../src/client/interfaces/components/ui/form/containers/main-fields.js';
29
+ export { SideFields } from '../../../src/client/interfaces/components/ui/form/containers/side-fields.js';
30
+ export { IndexField } from '../../../src/client/interfaces/components/ui/form/index-field.js';
31
+ export { SlugField } from '../../../src/client/interfaces/components/ui/form/slug-field.js';
32
+ export { ControlFields } from '../../../src/client/interfaces/components/ui/form/control-fields/control-fields.js';
33
+ export { ArrayInput } from '../../../src/client/interfaces/components/ui/inputs/array-input.js';
34
+ export { Checkbox } from '../../../src/client/interfaces/components/ui/inputs/checkbox.js';
35
+ export { Input } from '../../../src/client/interfaces/components/ui/inputs/input.js';
36
+ export { PasswordInput } from '../../../src/client/interfaces/components/ui/inputs/password-input.js';
37
+ export { SearchInput } from '../../../src/client/interfaces/components/ui/inputs/search-input.js';
38
+ export { Option, Select } from '../../../src/client/interfaces/components/ui/inputs/select.js';
39
+ export { Textarea } from '../../../src/client/interfaces/components/ui/inputs/textarea.js';
40
+ export { ContentContainer } from '../../../src/client/interfaces/components/ui/layouts/content-container.js';
41
+ export { DashboardSkeleton } from '../../../src/client/interfaces/components/ui/layouts/dashboard-skeleton.js';
42
+ export { AuthSkeleton } from '../../../src/client/interfaces/components/ui/layouts/auth-skeleton.js';
43
+ export { NavMain } from '../../../src/client/interfaces/components/ui/layouts/sidebar/nav-main.js';
44
+ import 'react/jsx-runtime';
45
+ import '@radix-ui/react-avatar';
46
+ import 'react';
47
+ import 'ua-parser-js';
48
+ import 'clsx';
49
+ import 'tailwind-merge';
50
+ import 'next/navigation';
51
+ import '../../../src/client/interfaces/components/shadcn/badge.js';
52
+ import '../../../src/client/interfaces/components/shadcn/button.js';
53
+ import '@radix-ui/react-collapsible';
54
+ import '@radix-ui/react-dialog';
55
+ import 'lucide-react';
56
+ import '@radix-ui/react-dropdown-menu';
57
+ import '../../../src/client/interfaces/components/shadcn/input-group.js';
58
+ import '@radix-ui/react-label';
59
+ import '@radix-ui/react-select';
60
+ import '@radix-ui/react-separator';
61
+ export { Sidebar, SidebarContent, SidebarInset, SidebarProvider, useSidebar } from '../../../src/client/interfaces/components/shadcn/sidebar.js';
62
+ import '@radix-ui/react-tooltip';
63
+ export { createNavbar } from '../../../src/client/interfaces/components/ui/layouts/navbar/navbar.js';
64
+ export { createI18nSelector } from '../../../src/client/interfaces/components/ui/layouts/navbar/i18n-selector.js';
65
+ export { createSignOutButton } from '../../../src/client/interfaces/components/ui/layouts/navbar/sign-out-button.js';
66
+ export { createFileCard } from '../../../src/client/interfaces/components/resources/file/file-card.js';
67
+ export { createFileList } from '../../../src/client/interfaces/components/resources/file/file-list.js';
@@ -0,0 +1,10 @@
1
+ import { usePathname } from 'next/navigation';
2
+
3
+ const useParentPathname = () => {
4
+ const pathname = usePathname();
5
+ if (pathname === "/") return "/";
6
+ const index = pathname.lastIndexOf("/");
7
+ return index <= 0 ? "/" : pathname.slice(0, index);
8
+ };
9
+
10
+ export { useParentPathname };
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { useEffect } from 'react';
3
+ import { VERIFY_CACHE_KEY } from '../../constants.js';
4
+
5
+ function createAdminInitializer({
6
+ useAdmin,
7
+ useQuery,
8
+ verifyAction
9
+ }) {
10
+ return function AdminInitializer() {
11
+ const { admin: globalAdmin, setAdmin, setIsLoading } = useAdmin();
12
+ const { data: admin, isFetching } = useQuery(
13
+ verifyAction,
14
+ [VERIFY_CACHE_KEY],
15
+ {
16
+ select: (data) => data?.admin,
17
+ enabled: !globalAdmin
18
+ }
19
+ );
20
+ useEffect(() => {
21
+ if (isFetching) return;
22
+ if (admin) setAdmin(admin);
23
+ setIsLoading(false);
24
+ }, [isFetching, admin, setAdmin, setIsLoading]);
25
+ return null;
26
+ };
27
+ }
28
+
29
+ export { createAdminInitializer };
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { useTranslator } from 'intor/react';
4
+ import { Lock, Trash2 } from 'lucide-react';
5
+ import { PATHS } from '../../../../../constants/paths/index.js';
6
+ import '../../../../../constants/redirect-paths.js';
7
+ import '../../../../../domain/resources/admin/constants.js';
8
+ import { isFileLocked } from '../../../../../domain/resources/file/utils/is-file-locked.js';
9
+ import 'mime-types';
10
+ import { findTranslation } from '../../../../../shared/translation/find-translation.js';
11
+ import { joinUrl } from '../../../../../shared/utils/join-url.js';
12
+ import 'react';
13
+ import 'ua-parser-js';
14
+ import { cn } from '../../../../applications/shadcn/utils.js';
15
+ import 'next/navigation';
16
+ import '@radix-ui/react-avatar';
17
+ import '../../shadcn/badge.js';
18
+ import '../../shadcn/button.js';
19
+ import '@radix-ui/react-collapsible';
20
+ import '@radix-ui/react-dialog';
21
+ import '@radix-ui/react-dropdown-menu';
22
+ import '../../shadcn/input-group.js';
23
+ import '@radix-ui/react-label';
24
+ import '@radix-ui/react-select';
25
+ import '@radix-ui/react-separator';
26
+ import '../../shadcn/sidebar.js';
27
+ import '@radix-ui/react-tooltip';
28
+ import { ResourceCard } from '../../ui/cards/resource-card/resource-card.js';
29
+ import 'next/link';
30
+ import 'next/image';
31
+ import '../../../../infrastructure/contexts/admin.js';
32
+ import 'next-themes';
33
+ import '@tanstack/react-query';
34
+ import 'sonner';
35
+ import 'intor/next';
36
+
37
+ const WIDTH = 160;
38
+ const HEIGHT = 160;
39
+ function createFileCard({
40
+ SmartImage,
41
+ storageUrl
42
+ }) {
43
+ return function FileCard({
44
+ file,
45
+ // link
46
+ openNewTab = false,
47
+ anchorProps,
48
+ // base
49
+ className = ""
50
+ }) {
51
+ const { locale } = useTranslator();
52
+ const isImage = file?.type === "IMAGE";
53
+ const isVideo = file?.type === "VIDEO";
54
+ const isLocked = isFileLocked(file);
55
+ const isTrash = file?.deletedAt;
56
+ const translation = findTranslation(file?.translations, locale);
57
+ return /* @__PURE__ */ jsx(
58
+ ResourceCard,
59
+ {
60
+ className,
61
+ style: { width: `${WIDTH}px`, height: `${HEIGHT}px` },
62
+ href: `${PATHS.resources.file.path}/${file?.id}`,
63
+ openNewTab,
64
+ anchorProps,
65
+ cardStatusBarProps: {
66
+ children: /* @__PURE__ */ jsxs("div", { className: "flex w-full justify-between", children: [
67
+ isLocked && /* @__PURE__ */ jsx(Lock, { className: "size-5" }),
68
+ isTrash && /* @__PURE__ */ jsx(Trash2, { className: "text-error size-5" })
69
+ ] })
70
+ },
71
+ cardTextContentProps: { title: translation?.name },
72
+ children: /* @__PURE__ */ jsx(
73
+ "div",
74
+ {
75
+ className: cn("flex-center flex-1", "overflow-hidden", "transition"),
76
+ children: isImage ? /* @__PURE__ */ jsx(SmartImage, { fileKey: file.key, width: WIDTH, height: HEIGHT }) : isVideo ? /* @__PURE__ */ jsx("video", { src: joinUrl(storageUrl, file.key), autoPlay: true, loop: true, muted: true }) : /* @__PURE__ */ jsx("span", { className: cn("scale-[3]", "transition"), children: "\u{1F4C4}" })
77
+ }
78
+ )
79
+ }
80
+ );
81
+ };
82
+ }
83
+
84
+ export { createFileCard };
@@ -0,0 +1,156 @@
1
+ "use client";
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { useState, useMemo, useEffect } from 'react';
4
+ import '../../../../../constants/paths/auth.js';
5
+ import '../../../../../constants/paths/main.js';
6
+ import '../../../../../constants/paths/resources.js';
7
+ import { CACHE_KEYS } from '../../../../../constants/cache-keys.js';
8
+ import '../../../../../constants/redirect-paths.js';
9
+ import 'mime-types';
10
+ import { debounce } from '../../../../../shared/utils/debounce.js';
11
+ import { ensureArray } from '../../../../../shared/utils/ensure-array.js';
12
+ import { DO_NOT_FETCH_KEY } from '../../../../../shared/list-items.js';
13
+ import 'ua-parser-js';
14
+ import { cn } from '../../../../applications/shadcn/utils.js';
15
+ import 'next/navigation';
16
+ import '@radix-ui/react-avatar';
17
+ import '../../shadcn/badge.js';
18
+ import '../../shadcn/button.js';
19
+ import '@radix-ui/react-collapsible';
20
+ import '@radix-ui/react-dialog';
21
+ import 'lucide-react';
22
+ import '@radix-ui/react-dropdown-menu';
23
+ import '../../shadcn/input-group.js';
24
+ import '@radix-ui/react-label';
25
+ import '@radix-ui/react-select';
26
+ import { Separator } from '../../shadcn/separator.js';
27
+ import '../../shadcn/sidebar.js';
28
+ import '@radix-ui/react-tooltip';
29
+ import 'intor/react';
30
+ import { ListCardsContainer } from '../../ui/blocks/list-cards-container/list-cards-container.js';
31
+ import 'next/link';
32
+ import '../../../../../domain/resources/admin/constants.js';
33
+ import 'next/image';
34
+ import { Tick } from '../../ui/features/tick.js';
35
+ import '../../../../infrastructure/contexts/admin.js';
36
+ import 'next-themes';
37
+ import '@tanstack/react-query';
38
+ import 'sonner';
39
+ import 'intor/next';
40
+ import { IsLockedButtons } from './is-locked-buttons.js';
41
+ import { TypeButtons } from './type-buttons.js';
42
+
43
+ function createFileList({
44
+ useQuery,
45
+ fileFindListCardsAction,
46
+ FileCard
47
+ }) {
48
+ return function FileList({
49
+ setItemStates,
50
+ // search
51
+ folderId,
52
+ // Use in File Manager, Folder page
53
+ isDeleted,
54
+ // Use in Trash Page
55
+ fileIds,
56
+ // link
57
+ openNewTab = false,
58
+ // pick
59
+ pickedItems,
60
+ handleClick
61
+ }) {
62
+ const [page, setPage] = useState(1);
63
+ const [pageSize, setPageSize] = useState(20);
64
+ const [searchString, setSearchString] = useState("");
65
+ const debouncedSetSearchString = useMemo(
66
+ () => debounce((v) => setSearchString(v), 300),
67
+ []
68
+ );
69
+ const [type, setType] = useState(null);
70
+ const [isLocked, setIsLocked] = useState(null);
71
+ useEffect(() => {
72
+ setPage(1);
73
+ }, [setPage, type, isLocked]);
74
+ const { data, isFetching, refetch } = useQuery(
75
+ () => fileFindListCardsAction({
76
+ page,
77
+ pageSize,
78
+ searchString,
79
+ type,
80
+ isLocked,
81
+ ...folderId && { folderId },
82
+ ...isDeleted && { isDeleted },
83
+ // Use in Trash
84
+ ...fileIds && { fileIds }
85
+ }),
86
+ [
87
+ CACHE_KEYS.findListCards("file"),
88
+ page,
89
+ pageSize,
90
+ searchString,
91
+ type,
92
+ isLocked,
93
+ folderId,
94
+ isDeleted,
95
+ JSON.stringify(fileIds)
96
+ ],
97
+ { enabled: folderId !== DO_NOT_FETCH_KEY }
98
+ // Use in File Manager
99
+ );
100
+ const files = useMemo(() => ensureArray(data?.items), [data?.items]);
101
+ useEffect(() => {
102
+ setItemStates?.({
103
+ items: files,
104
+ count: data?.total ?? 0,
105
+ isFetching,
106
+ refetch
107
+ });
108
+ }, [files, data?.total, isFetching, setItemStates]);
109
+ return /* @__PURE__ */ jsx(
110
+ ListCardsContainer,
111
+ {
112
+ page,
113
+ setPage,
114
+ pageSize,
115
+ setPageSize,
116
+ total: data?.total ?? 0,
117
+ searchString,
118
+ setSearchString: debouncedSetSearchString,
119
+ isFetching,
120
+ headerChildren: /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
121
+ /* @__PURE__ */ jsx(TypeButtons, { type: type || null, setType }),
122
+ /* @__PURE__ */ jsx("div", { className: "py-1", children: /* @__PURE__ */ jsx(Separator, { orientation: "vertical" }) }),
123
+ /* @__PURE__ */ jsx(IsLockedButtons, { isLocked, setIsLocked })
124
+ ] }),
125
+ children: files.map((file) => {
126
+ const isPicked = pickedItems?.some((item) => item.id === file.id);
127
+ return /* @__PURE__ */ jsxs("div", { className: "relative w-fit", children: [
128
+ /* @__PURE__ */ jsx(
129
+ FileCard,
130
+ {
131
+ file,
132
+ openNewTab,
133
+ className: cn(pickedItems && !isPicked && "opacity-50"),
134
+ anchorProps: handleClick && {
135
+ onClick: (e) => {
136
+ e.preventDefault();
137
+ handleClick(file);
138
+ }
139
+ }
140
+ }
141
+ ),
142
+ pickedItems && /* @__PURE__ */ jsx(
143
+ Tick,
144
+ {
145
+ isPicked: isPicked ?? false,
146
+ className: "absolute top-2 right-2"
147
+ }
148
+ )
149
+ ] }, file.id);
150
+ })
151
+ }
152
+ );
153
+ };
154
+ }
155
+
156
+ export { createFileList };
@@ -0,0 +1,68 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useTranslator } from 'intor/react';
3
+ import 'react';
4
+ import 'ua-parser-js';
5
+ import { cn } from '../../../../applications/shadcn/utils.js';
6
+ import 'next/navigation';
7
+ import 'lucide-react';
8
+ import '@radix-ui/react-avatar';
9
+ import '../../shadcn/badge.js';
10
+ import '../../shadcn/button.js';
11
+ import '@radix-ui/react-collapsible';
12
+ import '@radix-ui/react-dialog';
13
+ import '@radix-ui/react-dropdown-menu';
14
+ import '../../shadcn/input-group.js';
15
+ import '@radix-ui/react-label';
16
+ import '@radix-ui/react-select';
17
+ import '@radix-ui/react-separator';
18
+ import '../../shadcn/sidebar.js';
19
+ import '@radix-ui/react-tooltip';
20
+ import { Button } from '../../ui/buttons/button.js';
21
+ import 'next/link';
22
+ import '../../../../../constants/paths/auth.js';
23
+ import '../../../../../constants/paths/main.js';
24
+ import '../../../../../constants/paths/resources.js';
25
+ import '../../../../../constants/redirect-paths.js';
26
+ import 'mime-types';
27
+ import '../../../../../domain/resources/admin/constants.js';
28
+ import 'next/image';
29
+ import '../../../../infrastructure/contexts/admin.js';
30
+ import 'next-themes';
31
+ import '@tanstack/react-query';
32
+ import 'sonner';
33
+ import 'intor/next';
34
+
35
+ function IsLockedButtons({
36
+ isLocked,
37
+ setIsLocked
38
+ }) {
39
+ const { t } = useTranslator();
40
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-fit gap-3", children: [
41
+ /* @__PURE__ */ jsx(
42
+ Button,
43
+ {
44
+ type: "button",
45
+ size: "sm",
46
+ variant: "secondary",
47
+ onClick: () => {
48
+ setIsLocked(isLocked === true ? null : true);
49
+ },
50
+ className: cn(isLocked !== true ? "opacity-35" : "shadow"),
51
+ children: t("resources.file.locked.text")
52
+ }
53
+ ),
54
+ /* @__PURE__ */ jsx(
55
+ Button,
56
+ {
57
+ type: "button",
58
+ size: "sm",
59
+ variant: "secondary",
60
+ onClick: () => setIsLocked(isLocked === false ? null : false),
61
+ className: cn(isLocked !== false ? "opacity-35" : "shadow"),
62
+ children: t("resources.file.not-locked.text")
63
+ }
64
+ )
65
+ ] });
66
+ }
67
+
68
+ export { IsLockedButtons };
@@ -0,0 +1,59 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useTranslator } from 'intor/react';
3
+ import '../../../../../domain/resources/admin/constants.js';
4
+ import { FILE_TYPES } from '../../../../../domain/resources/file/props.js';
5
+ import 'react';
6
+ import 'ua-parser-js';
7
+ import { cn } from '../../../../applications/shadcn/utils.js';
8
+ import 'next/navigation';
9
+ import 'lucide-react';
10
+ import '@radix-ui/react-avatar';
11
+ import '../../shadcn/badge.js';
12
+ import '../../shadcn/button.js';
13
+ import '@radix-ui/react-collapsible';
14
+ import '@radix-ui/react-dialog';
15
+ import '@radix-ui/react-dropdown-menu';
16
+ import '../../shadcn/input-group.js';
17
+ import '@radix-ui/react-label';
18
+ import '@radix-ui/react-select';
19
+ import '@radix-ui/react-separator';
20
+ import '../../shadcn/sidebar.js';
21
+ import '@radix-ui/react-tooltip';
22
+ import { Button } from '../../ui/buttons/button.js';
23
+ import 'next/link';
24
+ import '../../../../../constants/paths/auth.js';
25
+ import '../../../../../constants/paths/main.js';
26
+ import '../../../../../constants/paths/resources.js';
27
+ import '../../../../../constants/redirect-paths.js';
28
+ import 'mime-types';
29
+ import 'next/image';
30
+ import '../../../../infrastructure/contexts/admin.js';
31
+ import 'next-themes';
32
+ import '@tanstack/react-query';
33
+ import 'sonner';
34
+ import 'intor/next';
35
+
36
+ function TypeButtons({ type, setType }) {
37
+ const { t } = useTranslator();
38
+ const handleClick = (fileType) => {
39
+ if (fileType === type) {
40
+ setType(null);
41
+ } else {
42
+ setType(fileType);
43
+ }
44
+ };
45
+ return /* @__PURE__ */ jsx("div", { className: "flex h-fit gap-3", children: Object.values(FILE_TYPES).map((fileType) => /* @__PURE__ */ jsx(
46
+ Button,
47
+ {
48
+ type: "button",
49
+ size: "sm",
50
+ variant: "secondary",
51
+ onClick: () => handleClick(fileType),
52
+ className: cn(fileType !== type ? "opacity-35" : "shadow"),
53
+ children: t(`resources.file.file-type.${fileType.toLowerCase()}.text`)
54
+ },
55
+ fileType
56
+ )) });
57
+ }
58
+
59
+ export { TypeButtons };
@@ -14,7 +14,7 @@ import { Input } from './input.js';
14
14
  import { Separator } from './separator.js';
15
15
  import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './sheet.js';
16
16
  import { Skeleton } from './skeleton.js';
17
- import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './tooltip.js';
17
+ import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from './tooltip.js';
18
18
 
19
19
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
20
20
  const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
@@ -0,0 +1,84 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { useTranslator } from 'intor/react';
4
+ import { useEffect } from 'react';
5
+ import '@radix-ui/react-avatar';
6
+ import 'ua-parser-js';
7
+ import 'clsx';
8
+ import 'tailwind-merge';
9
+ import 'next/navigation';
10
+ import '../../../shadcn/badge.js';
11
+ import '../../../shadcn/button.js';
12
+ import '@radix-ui/react-collapsible';
13
+ import '@radix-ui/react-dialog';
14
+ import 'lucide-react';
15
+ import '@radix-ui/react-dropdown-menu';
16
+ import '../../../shadcn/input-group.js';
17
+ import '@radix-ui/react-label';
18
+ import '@radix-ui/react-select';
19
+ import '@radix-ui/react-separator';
20
+ import '../../../shadcn/sidebar.js';
21
+ import { Spinner } from '../../../shadcn/spinner.js';
22
+ import '@radix-ui/react-tooltip';
23
+ import { SearchInput } from '../../inputs/search-input.js';
24
+ import { PageSizeSelector } from './page-size-selector.js';
25
+ import { Pagination } from './pagination.js';
26
+
27
+ function ListCardsContainer({
28
+ // pagination
29
+ page,
30
+ setPage,
31
+ pageSize,
32
+ setPageSize,
33
+ total,
34
+ // search string
35
+ searchString,
36
+ setSearchString,
37
+ // ui states
38
+ isFetching,
39
+ // base
40
+ children,
41
+ headerChildren
42
+ }) {
43
+ const { t } = useTranslator();
44
+ const isNotFound = total === 0;
45
+ useEffect(() => {
46
+ setPage(1);
47
+ }, [searchString, setPage]);
48
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col gap-6", children: [
49
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
50
+ headerChildren,
51
+ /* @__PURE__ */ jsx("div", { className: "ml-auto w-64", children: /* @__PURE__ */ jsx(
52
+ SearchInput,
53
+ {
54
+ searchString,
55
+ setSearchString,
56
+ isLoading: isFetching
57
+ }
58
+ ) })
59
+ ] }),
60
+ /* @__PURE__ */ jsx("div", { className: "max-h-[88%] flex-1 overflow-y-auto", children: isFetching ? /* @__PURE__ */ jsx(Spinner, {}) : isNotFound ? /* @__PURE__ */ jsx("p", { className: "text-sm opacity-50", children: t("ui.no-data.text") }) : /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-4", children }) }),
61
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
62
+ /* @__PURE__ */ jsx("div", { className: "w-52" }),
63
+ /* @__PURE__ */ jsx(
64
+ Pagination,
65
+ {
66
+ page,
67
+ setPage,
68
+ pageSize,
69
+ total
70
+ }
71
+ ),
72
+ /* @__PURE__ */ jsx(
73
+ PageSizeSelector,
74
+ {
75
+ pageSize,
76
+ setPageSize,
77
+ setPage
78
+ }
79
+ )
80
+ ] })
81
+ ] });
82
+ }
83
+
84
+ export { ListCardsContainer };
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { useTranslator } from 'intor/react';
4
+ import 'lucide-react';
5
+ import 'react';
6
+ import 'ua-parser-js';
7
+ import 'clsx';
8
+ import 'tailwind-merge';
9
+ import 'next/navigation';
10
+ import '@radix-ui/react-avatar';
11
+ import '../../../shadcn/badge.js';
12
+ import '../../../shadcn/button.js';
13
+ import '@radix-ui/react-collapsible';
14
+ import '@radix-ui/react-dialog';
15
+ import '@radix-ui/react-dropdown-menu';
16
+ import '../../../shadcn/input-group.js';
17
+ import '@radix-ui/react-label';
18
+ import '@radix-ui/react-select';
19
+ import '@radix-ui/react-separator';
20
+ import '../../../shadcn/sidebar.js';
21
+ import '@radix-ui/react-tooltip';
22
+ import { Select, Option } from '../../inputs/select.js';
23
+
24
+ function PageSizeSelector({
25
+ pageSize,
26
+ setPageSize,
27
+ setPage
28
+ }) {
29
+ const { t } = useTranslator();
30
+ return /* @__PURE__ */ jsxs("div", { className: "flex w-52 items-center gap-4", children: [
31
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm whitespace-nowrap", children: t("ui.layout.item-list-container.items-per-page.text") }),
32
+ /* @__PURE__ */ jsxs(
33
+ Select,
34
+ {
35
+ value: String(pageSize),
36
+ onValueChange: (value) => {
37
+ setPageSize(Number(value ?? 20));
38
+ setPage(1);
39
+ },
40
+ className: "w-full",
41
+ children: [
42
+ /* @__PURE__ */ jsx(Option, { value: String(20), children: "20" }),
43
+ /* @__PURE__ */ jsx(Option, { value: String(40), children: "40" }),
44
+ /* @__PURE__ */ jsx(Option, { value: String(80), children: "80" })
45
+ ]
46
+ }
47
+ )
48
+ ] });
49
+ }
50
+
51
+ export { PageSizeSelector };