@illuminateeducation/dna-atd-frontend 1.0.1-DNAATD-2189.0 → 1.0.2-DNAATD-3045-v3-POC.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +21 -21
  2. package/dist/assets/dna-atd-frontend.css +1 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.es.js +47350 -0
  5. package/dist/index.es.js.map +1 -0
  6. package/dist/src/App.vue.d.ts +2 -0
  7. package/dist/src/components/common/BaseButton.vue.d.ts +16 -0
  8. package/dist/src/components/common/BaseInput.vue.d.ts +8 -0
  9. package/dist/src/components/common/BaseModal.vue.d.ts +19 -0
  10. package/dist/src/components/common/ErrorBoundary.vue.d.ts +37 -0
  11. package/dist/src/composables/useAsync.d.ts +24 -0
  12. package/dist/src/composables/useClickOutside.d.ts +7 -0
  13. package/dist/src/composables/useForm.d.ts +38 -0
  14. package/dist/src/composables/useLocalStorage.d.ts +24 -0
  15. package/dist/src/composables/useWindowSize.d.ts +20 -0
  16. package/dist/src/config/app.config.d.ts +67 -0
  17. package/dist/src/context/backendContext.d.ts +9 -0
  18. package/dist/src/features/admin/customization/composables/useCustomization.d.ts +19 -0
  19. package/dist/src/features/admin/customization/store/customizationStore.d.ts +30 -0
  20. package/dist/src/features/admin/customization/views/CustomizationView.vue.d.ts +2 -0
  21. package/dist/src/features/admin/validation/composables/useValidation.d.ts +18 -0
  22. package/dist/src/features/admin/validation/store/validationStore.d.ts +27 -0
  23. package/dist/src/features/admin/validation/views/ValidationView.vue.d.ts +2 -0
  24. package/dist/src/features/reports/codeBasedJasper/components/AssessmentFinder.vue.d.ts +618 -0
  25. package/dist/src/features/reports/codeBasedJasper/components/DownloadButtons.vue.d.ts +13 -0
  26. package/dist/src/features/reports/codeBasedJasper/components/FavoritesWidget.vue.d.ts +10 -0
  27. package/dist/src/features/reports/codeBasedJasper/components/MultipleAssessmentIdsField.vue.d.ts +18 -0
  28. package/dist/src/features/reports/codeBasedJasper/components/ReportFilters.vue.d.ts +18 -0
  29. package/dist/src/features/reports/codeBasedJasper/components/ReportPagination.vue.d.ts +11 -0
  30. package/dist/src/features/reports/codeBasedJasper/components/ReportViewer.vue.d.ts +16 -0
  31. package/dist/src/features/reports/codeBasedJasper/composables/useCodeBasedJasper.d.ts +184 -0
  32. package/dist/src/features/reports/codeBasedJasper/mount.d.ts +1 -0
  33. package/dist/src/features/reports/codeBasedJasper/services/codeBasedJasperApi.d.ts +190 -0
  34. package/dist/src/features/reports/codeBasedJasper/store/codeBasedJasperStore.d.ts +503 -0
  35. package/dist/src/features/reports/codeBasedJasper/types/index.d.ts +54 -0
  36. package/dist/src/features/reports/codeBasedJasper/views/CodeBasedJasperReportView.vue.d.ts +32 -0
  37. package/dist/src/index.d.ts +51 -0
  38. package/dist/src/layouts/AdminLayout.vue.d.ts +2 -0
  39. package/dist/src/plugins/globalErrorHandling.d.ts +36 -0
  40. package/dist/src/plugins/vuetify.d.ts +86 -0
  41. package/dist/src/router/index.d.ts +16 -0
  42. package/dist/src/services/apiService.d.ts +33 -0
  43. package/dist/src/services/integration.d.ts +54 -0
  44. package/dist/src/types/api.d.ts +27 -0
  45. package/dist/src/types/backend.d.ts +27 -0
  46. package/dist/src/utils/helpers.d.ts +50 -0
  47. package/dist/src/utils/safeJson.d.ts +17 -0
  48. package/dist/src/views/HomeView.vue.d.ts +2 -0
  49. package/dist/src/views/NotFoundView.vue.d.ts +2 -0
  50. package/package.json +33 -22
  51. package/dist/.vite/manifest.json +0 -87
  52. package/dist/assets/AdminLayout.css +0 -1
  53. package/dist/assets/AdminLayout.js +0 -1
  54. package/dist/assets/CustomizationView.css +0 -1
  55. package/dist/assets/CustomizationView.js +0 -1
  56. package/dist/assets/HomeView.css +0 -1
  57. package/dist/assets/HomeView.js +0 -1
  58. package/dist/assets/NotFoundView.css +0 -1
  59. package/dist/assets/NotFoundView.js +0 -1
  60. package/dist/assets/ValidationView.css +0 -1
  61. package/dist/assets/ValidationView.js +0 -1
  62. package/dist/assets/_plugin-vue_export-helper.js +0 -1
  63. package/dist/assets/index.css +0 -1
  64. package/dist/assets/index.js +0 -2
  65. package/dist/index.html +0 -14
  66. package/index.js +0 -1
  67. package/src/App.vue +0 -68
  68. package/src/__tests__/App.spec.js +0 -26
  69. package/src/components/common/BaseButton.vue +0 -20
  70. package/src/components/common/BaseInput.vue +0 -27
  71. package/src/components/common/BaseModal.vue +0 -37
  72. package/src/composables/useAsync.js +0 -34
  73. package/src/composables/useClickOutside.js +0 -29
  74. package/src/composables/useForm.js +0 -89
  75. package/src/composables/useLocalStorage.js +0 -51
  76. package/src/composables/useWindowSize.js +0 -30
  77. package/src/config/app.config.js +0 -79
  78. package/src/features/admin/customization/composables/useCustomization.js +0 -19
  79. package/src/features/admin/customization/store/customizationStore.js +0 -30
  80. package/src/features/admin/customization/views/CustomizationView.vue +0 -17
  81. package/src/features/admin/validation/composables/useValidation.js +0 -18
  82. package/src/features/admin/validation/store/validationStore.js +0 -25
  83. package/src/features/admin/validation/views/ValidationView.vue +0 -17
  84. package/src/index.js +0 -53
  85. package/src/layouts/AdminLayout.vue +0 -146
  86. package/src/main.js +0 -41
  87. package/src/router/index.js +0 -57
  88. package/src/services/apiService.js +0 -72
  89. package/src/services/integration.js +0 -59
  90. package/src/services/phpIntegration.js +0 -1
  91. package/src/stores/counter.js +0 -12
  92. package/src/utils/helpers.js +0 -119
  93. package/src/utils/validators.js +0 -131
  94. package/src/views/HomeView.vue +0 -121
  95. package/src/views/NotFoundView.vue +0 -56
@@ -0,0 +1,86 @@
1
+ import { VuetifyOptions } from 'vuetify';
2
+ export type { VuetifyOptions };
3
+ export declare function createVuetifyInstance(options?: VuetifyOptions): {
4
+ install: (app: import('vue').App<any>) => void;
5
+ unmount: () => void;
6
+ defaults: import('vue').Ref<import('vuetify').DefaultsInstance, import('vuetify').DefaultsInstance>;
7
+ display: import('vuetify').DisplayInstance;
8
+ theme: import('vuetify').ThemeInstance & {
9
+ install: (app: import('vue').App<any>) => void;
10
+ };
11
+ icons: {
12
+ defaultSet: string;
13
+ aliases: Partial<import('vuetify').IconAliases>;
14
+ sets: Record<string, import('vuetify').IconSet>;
15
+ };
16
+ locale: {
17
+ name: string;
18
+ decimalSeparator: import('vue').ShallowRef<string>;
19
+ messages: import('vue').Ref<import('vuetify').LocaleMessages, import('vuetify').LocaleMessages>;
20
+ current: import('vue').Ref<string, string>;
21
+ fallback: import('vue').Ref<string, string>;
22
+ t: (key: string, ...params: unknown[]) => string;
23
+ n: (value: number) => string;
24
+ provide: (props: import('vuetify').LocaleOptions) => import('vuetify').LocaleInstance;
25
+ isRtl: import('vue').Ref<boolean, boolean>;
26
+ rtl: import('vue').Ref<Record<string, boolean>, Record<string, boolean>>;
27
+ rtlClasses: import('vue').Ref<string, string>;
28
+ };
29
+ date: {
30
+ options: {
31
+ adapter: (new (options: {
32
+ locale: any;
33
+ formats?: any;
34
+ }) => import('vuetify').DateInstance) | import('vuetify').DateInstance;
35
+ formats?: Record<string, any>;
36
+ locale: Record<string, any>;
37
+ };
38
+ instance: {
39
+ date: (value?: any) => unknown;
40
+ format: (date: unknown, formatString: string) => string;
41
+ toJsDate: (value: unknown) => Date;
42
+ parseISO: (date: string) => unknown;
43
+ toISO: (date: unknown) => string;
44
+ startOfDay: (date: unknown) => unknown;
45
+ endOfDay: (date: unknown) => unknown;
46
+ startOfWeek: (date: unknown, firstDayOfWeek?: string | number | undefined) => unknown;
47
+ endOfWeek: (date: unknown) => unknown;
48
+ startOfMonth: (date: unknown) => unknown;
49
+ endOfMonth: (date: unknown) => unknown;
50
+ startOfYear: (date: unknown) => unknown;
51
+ endOfYear: (date: unknown) => unknown;
52
+ isAfter: (date: unknown, comparing: unknown) => boolean;
53
+ isAfterDay: (date: unknown, comparing: unknown) => boolean;
54
+ isSameDay: (date: unknown, comparing: unknown) => boolean;
55
+ isSameMonth: (date: unknown, comparing: unknown) => boolean;
56
+ isSameYear: (date: unknown, comparing: unknown) => boolean;
57
+ isBefore: (date: unknown, comparing: unknown) => boolean;
58
+ isEqual: (date: unknown, comparing: unknown) => boolean;
59
+ isValid: (date: any) => boolean;
60
+ isWithinRange: (date: unknown, range: [unknown, unknown]) => boolean;
61
+ addMinutes: (date: unknown, amount: number) => unknown;
62
+ addHours: (date: unknown, amount: number) => unknown;
63
+ addDays: (date: unknown, amount: number) => unknown;
64
+ addWeeks: (date: unknown, amount: number) => unknown;
65
+ addMonths: (date: unknown, amount: number) => unknown;
66
+ getYear: (date: unknown) => number;
67
+ setYear: (date: unknown, year: number) => unknown;
68
+ getDiff: (date: unknown, comparing: unknown, unit?: string | undefined) => number;
69
+ getWeekArray: (date: unknown, firstDayOfWeek?: string | number | undefined) => unknown[][];
70
+ getWeekdays: (firstDayOfWeek?: string | number | undefined, weekdayFormat?: "long" | "narrow" | "short" | undefined) => string[];
71
+ getWeek: (date: unknown, firstDayOfWeek?: string | number | undefined, firstDayOfYear?: string | number | undefined) => number;
72
+ getMonth: (date: unknown) => number;
73
+ setMonth: (date: unknown, month: number) => unknown;
74
+ getDate: (date: unknown) => number;
75
+ setDate: (date: unknown, day: number) => unknown;
76
+ getNextMonth: (date: unknown) => unknown;
77
+ getPreviousMonth: (date: unknown) => unknown;
78
+ getHours: (date: unknown) => number;
79
+ setHours: (date: unknown, hours: number) => unknown;
80
+ getMinutes: (date: unknown) => number;
81
+ setMinutes: (date: unknown, minutes: number) => unknown;
82
+ locale?: any;
83
+ };
84
+ };
85
+ goTo: import('vuetify').GoToInstance;
86
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @file index.ts
3
+ * @description Vue Router configuration for DNA ATD Frontend application
4
+ * @author Illuminate Education
5
+ * @lastUpdated 2025-12-21
6
+ *
7
+ * @responsibilities
8
+ * - Defines application routing structure and navigation
9
+ * - Configures route hierarchy with nested admin routes
10
+ * - Implements navigation guards for authentication checks
11
+ * - Manages route metadata (titles, auth requirements)
12
+ * - Handles 404 Not Found fallback routing
13
+ * - Uses lazy loading for optimal performance
14
+ */
15
+ declare const router: import('vue-router').Router;
16
+ export default router;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @file apiService.ts
3
+ * @description Centralized HTTP API service for all backend communications
4
+ * @author Illuminate Education
5
+ * @lastUpdated 2025-12-21
6
+ *
7
+ * @responsibilities
8
+ * - Provides unified API request interface using native Fetch API
9
+ * - Handles HTTP methods: GET, POST, PUT, PATCH, DELETE
10
+ * - Manages request/response formatting and JSON serialization
11
+ * - Implements centralized error handling and logging
12
+ * - Configures base URL from environment variables
13
+ * - Sets default headers (Content-Type, custom headers)
14
+ * - Validates HTTP response status codes
15
+ */
16
+ type ApiBody = unknown | FormData | string | null | undefined;
17
+ export type ApiRequestOptions = Omit<RequestInit, 'body' | 'headers'> & {
18
+ body?: ApiBody;
19
+ headers?: Record<string, string>;
20
+ };
21
+ declare class ApiService {
22
+ private baseURL;
23
+ constructor(baseURL?: string);
24
+ request<T = unknown>(endpoint: string, options?: ApiRequestOptions): Promise<T>;
25
+ requestTyped<TEndpoint extends string, TResponse = unknown>(endpoint: TEndpoint, options?: ApiRequestOptions): Promise<TResponse>;
26
+ get<T = unknown>(endpoint: string, options?: Omit<ApiRequestOptions, 'method'>): Promise<T>;
27
+ post<T = unknown>(endpoint: string, data: unknown | FormData, options?: Omit<ApiRequestOptions, 'method' | 'body'>): Promise<T>;
28
+ put<T = unknown>(endpoint: string, data: unknown | FormData, options?: Omit<ApiRequestOptions, 'method' | 'body'>): Promise<T>;
29
+ patch<T = unknown>(endpoint: string, data: unknown | FormData, options?: Omit<ApiRequestOptions, 'method' | 'body'>): Promise<T>;
30
+ delete<T = unknown>(endpoint: string, options?: Omit<ApiRequestOptions, 'method'>): Promise<T>;
31
+ }
32
+ export declare const apiService: ApiService;
33
+ export {};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file integration.ts
3
+ * @description Service for bidirectional communication between Vue app and backend systems
4
+ * @author Illuminate Education
5
+ * @lastUpdated 2025-12-21
6
+ *
7
+ * @responsibilities
8
+ * - Reads backend config/user from a host-provided global bootstrap object (default: window.APP_DATA)
9
+ * - Enables retrieval of custom bootstrap data by key
10
+ * - Emits events to host/backend via window custom events
11
+ * - Listens for and handles host/backend-triggered events
12
+ * - Implements singleton pattern for consistent integration access
13
+ */
14
+ export type JsonObject = Record<string, unknown>;
15
+ export type IntegrationOptions = {
16
+ /**
17
+ * Optional global bootstrap variable name. In the host app, a common pattern is:
18
+ * `APP_DATA = {...}`.
19
+ *
20
+ * This is the single source of truth for config/user/data in this library.
21
+ */
22
+ globalDataKey?: string;
23
+ };
24
+ export declare class Integration {
25
+ private globalDataKey?;
26
+ config: JsonObject;
27
+ user: JsonObject;
28
+ constructor(options?: IntegrationOptions);
29
+ setGlobalDataKey(globalDataKey?: string): void;
30
+ private getGlobalBootstrap;
31
+ private getBootstrapConfig;
32
+ private getBootstrapUser;
33
+ /**
34
+ * Get configuration from backend
35
+ */
36
+ getConfig(): JsonObject;
37
+ /**
38
+ * Get user data from backend
39
+ */
40
+ getUser(): JsonObject;
41
+ /**
42
+ * Get any custom bootstrap data by key.
43
+ */
44
+ getData<T = unknown>(attribute: string): T | null;
45
+ /**
46
+ * Emit event to backend (via window for backend to listen)
47
+ */
48
+ emitToBackend<T = unknown>(eventName: string, data: T): void;
49
+ /**
50
+ * Listen for backend events
51
+ */
52
+ listenFromBackend<T = unknown>(eventName: string, callback: (data: T) => void): void;
53
+ }
54
+ export declare const integration: Integration;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @file api.ts
3
+ * @description Shared API typing utilities for request/response contracts.
4
+ * @lastUpdated 2025-12-21
5
+ *
6
+ * @responsibilities
7
+ * - Defines JSON value types
8
+ * - Defines an extendable endpoint map for consumers (module augmentation)
9
+ */
10
+ export type JsonPrimitive = string | number | boolean | null;
11
+ export type JsonValue = JsonPrimitive | JsonValue[] | {
12
+ [key: string]: JsonValue;
13
+ };
14
+ /**
15
+ * Consumers can augment this interface to get typed endpoints.
16
+ *
17
+ * Example:
18
+ * declare module '@illuminateeducation/dna-atd-frontend' {
19
+ * interface ApiEndpointMap {
20
+ * '/api/foo': { id: number }
21
+ * }
22
+ * }
23
+ */
24
+ export interface ApiEndpointMap {
25
+ }
26
+ export type ApiResponseFor<TEndpoint extends keyof ApiEndpointMap> = ApiEndpointMap[TEndpoint];
27
+ export type ApiMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @file backend.ts
3
+ * @description Shared typing contracts for backend bootstrap data (config/user).
4
+ * @lastUpdated 2025-12-21
5
+ *
6
+ * @responsibilities
7
+ * - Defines base interfaces for config and user payloads
8
+ * - Provides an ergonomic default shape while allowing extension
9
+ */
10
+ export interface BackendUser {
11
+ id?: number | string;
12
+ user_id?: number | string;
13
+ full_name?: string;
14
+ initials?: string;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface BackendConfig {
18
+ base_url?: string;
19
+ csrf_token?: string;
20
+ endpoints?: Record<string, string>;
21
+ feature_flags?: Record<string, boolean>;
22
+ [key: string]: unknown;
23
+ }
24
+ export interface BackendContextData {
25
+ config: BackendConfig;
26
+ user: BackendUser;
27
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @file helpers.ts
3
+ * @description Collection of reusable utility functions for common operations
4
+ * @author Illuminate Education
5
+ * @lastUpdated 2025-12-21
6
+ *
7
+ * @responsibilities
8
+ * - Provides performance optimization functions (debounce, throttle)
9
+ * - Handles object manipulation (deep cloning)
10
+ * - Date formatting and manipulation utilities
11
+ * - String operations (capitalize, truncate)
12
+ * - Unique ID generation
13
+ * - Value validation helpers (isEmpty checks)
14
+ * - Shared utility logic across the application
15
+ */
16
+ type AnyFn = (...args: unknown[]) => unknown;
17
+ /**
18
+ * Debounce function to limit rate of function execution
19
+ */
20
+ export declare function debounce<T extends AnyFn>(func: T, wait?: number): (...args: Parameters<T>) => void;
21
+ /**
22
+ * Throttle function to limit function execution frequency
23
+ */
24
+ export declare function throttle<T extends AnyFn>(func: T, limit?: number): (...args: Parameters<T>) => void;
25
+ /**
26
+ * Deep clone an object (best-effort; handles Date/Array/plain objects)
27
+ */
28
+ export declare function deepClone<T>(obj: T): T;
29
+ type DateFormat = 'short' | 'long' | 'time';
30
+ /**
31
+ * Format date to readable string
32
+ */
33
+ export declare function formatDate(date: Date | string, format?: DateFormat): string;
34
+ /**
35
+ * Generate unique ID
36
+ */
37
+ export declare function generateId(): string;
38
+ /**
39
+ * Capitalize first letter of string
40
+ */
41
+ export declare function capitalize(str: string): string;
42
+ /**
43
+ * Truncate string to specified length
44
+ */
45
+ export declare function truncate(str: string, length?: number, suffix?: string): string;
46
+ /**
47
+ * Check if value is empty (null, undefined, empty string, empty array, empty object)
48
+ */
49
+ export declare function isEmpty(value: unknown): boolean;
50
+ export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @file safeJson.ts
3
+ * @description Small helper for safe JSON parsing with fallback.
4
+ * @lastUpdated 2025-12-21
5
+ *
6
+ * @responsibilities
7
+ * - Parses JSON safely without throwing
8
+ * - Returns a caller-provided fallback when parsing fails
9
+ */
10
+ export type JsonParseOptions<T> = {
11
+ fallback: T;
12
+ label?: string;
13
+ };
14
+ /**
15
+ * Safe JSON.parse with fallback. Useful when values come from backend-rendered DOM attributes.
16
+ */
17
+ export declare function parseJsonSafely<T>(json: string | null, { fallback, label }: JsonParseOptions<T>): T;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
package/package.json CHANGED
@@ -1,25 +1,21 @@
1
1
  {
2
2
  "name": "@illuminateeducation/dna-atd-frontend",
3
- "version": "1.0.1-DNAATD-2189.0",
3
+ "version": "1.0.2-DNAATD-3045-v3-POC.0",
4
4
  "description": "DNA ATD Frontend - Vue 3 application for Illuminate Education",
5
5
  "private": false,
6
6
  "type": "module",
7
- "main": "./index.js",
8
- "module": "./index.js",
7
+ "main": "./dist/index.es.js",
8
+ "module": "./dist/index.es.js",
9
+ "types": "./dist/index.d.ts",
9
10
  "exports": {
10
11
  ".": {
11
- "import": "./index.js",
12
- "default": "./index.js"
12
+ "import": "./dist/index.es.js",
13
+ "default": "./dist/index.es.js"
13
14
  },
14
- "./dist/*": "./dist/*",
15
15
  "./package.json": "./package.json"
16
16
  },
17
17
  "files": [
18
- "index.js",
19
- "dist/",
20
- "src/",
21
- "README.md",
22
- "LICENSE"
18
+ "dist/"
23
19
  ],
24
20
  "keywords": [
25
21
  "vue",
@@ -28,15 +24,6 @@
28
24
  "illuminate",
29
25
  "frontend"
30
26
  ],
31
- "author": "Illuminate Education",
32
- "license": "UNLICENSED",
33
- "repository": {
34
- "type": "git",
35
- "url": "git+https://github.com/illuminateeducation/dna-atd-frontend.git"
36
- },
37
- "bugs": {
38
- "url": "https://github.com/illuminateeducation/dna-atd-frontend/issues"
39
- },
40
27
  "homepage": "https://github.com/illuminateeducation/dna-atd-frontend#readme",
41
28
  "engines": {
42
29
  "node": "^20.19.0 || >=22.12.0"
@@ -44,21 +31,45 @@
44
31
  "scripts": {
45
32
  "dev": "vite",
46
33
  "build": "vite build",
34
+ "build:lib": "vite build",
47
35
  "preview": "vite preview",
36
+ "typecheck": "vue-tsc --noEmit -p tsconfig.vue.json",
37
+ "typecheck:test": "vue-tsc --noEmit -p tsconfig.vitest.json",
38
+ "lint": "eslint .",
39
+ "lint:fix": "eslint . --fix",
40
+ "format": "prettier . --write",
41
+ "format:check": "prettier . --check",
48
42
  "test:unit": "vitest",
49
- "test": "vitest run"
43
+ "test": "vitest run",
44
+ "prepublishOnly": "npm run build"
50
45
  },
51
46
  "dependencies": {
47
+ "@mdi/font": "^7.4.47",
52
48
  "pinia": "^3.0.4",
49
+ "vuetify": "^3.7.0",
53
50
  "vue": "^3.5.25",
54
- "vue-router": "^4.6.3"
51
+ "vue-router": "^4.6.3",
52
+ "vuedraggable": "^4.1.0"
55
53
  },
56
54
  "devDependencies": {
55
+ "@eslint/js": "^9.35.0",
56
+ "@types/node": "^24.3.1",
57
57
  "@vitejs/plugin-vue": "^6.0.2",
58
58
  "@vue/test-utils": "^2.4.6",
59
+ "eslint": "^9.35.0",
60
+ "eslint-config-prettier": "^10.1.1",
61
+ "eslint-plugin-vue": "^10.4.0",
59
62
  "jsdom": "^27.2.0",
63
+ "prettier": "^3.6.2",
64
+ "sass": "^1.86.0",
65
+ "typescript-eslint": "^8.44.0",
66
+ "typescript": "^5.9.2",
60
67
  "vite": "^7.2.4",
68
+ "vite-plugin-dts": "^4.5.4",
69
+ "vite-plugin-vuetify": "^2.1.0",
61
70
  "vite-plugin-vue-devtools": "^8.0.5",
71
+ "vue-eslint-parser": "^10.2.0",
72
+ "vue-tsc": "^3.0.8",
62
73
  "vitest": "^4.0.14"
63
74
  }
64
75
  }
@@ -1,87 +0,0 @@
1
- {
2
- "__plugin-vue_export-helper.js": {
3
- "file": "assets/_plugin-vue_export-helper.js",
4
- "name": "_plugin-vue_export-helper"
5
- },
6
- "index.html": {
7
- "file": "assets/index.js",
8
- "name": "index",
9
- "src": "index.html",
10
- "isEntry": true,
11
- "dynamicImports": [
12
- "src/views/HomeView.vue",
13
- "src/layouts/AdminLayout.vue",
14
- "src/features/admin/validation/views/ValidationView.vue",
15
- "src/features/admin/customization/views/CustomizationView.vue",
16
- "src/views/NotFoundView.vue"
17
- ],
18
- "css": [
19
- "assets/index.css"
20
- ]
21
- },
22
- "src/features/admin/customization/views/CustomizationView.vue": {
23
- "file": "assets/CustomizationView.js",
24
- "name": "CustomizationView",
25
- "src": "src/features/admin/customization/views/CustomizationView.vue",
26
- "isDynamicEntry": true,
27
- "imports": [
28
- "__plugin-vue_export-helper.js",
29
- "index.html"
30
- ],
31
- "css": [
32
- "assets/CustomizationView.css"
33
- ]
34
- },
35
- "src/features/admin/validation/views/ValidationView.vue": {
36
- "file": "assets/ValidationView.js",
37
- "name": "ValidationView",
38
- "src": "src/features/admin/validation/views/ValidationView.vue",
39
- "isDynamicEntry": true,
40
- "imports": [
41
- "__plugin-vue_export-helper.js",
42
- "index.html"
43
- ],
44
- "css": [
45
- "assets/ValidationView.css"
46
- ]
47
- },
48
- "src/layouts/AdminLayout.vue": {
49
- "file": "assets/AdminLayout.js",
50
- "name": "AdminLayout",
51
- "src": "src/layouts/AdminLayout.vue",
52
- "isDynamicEntry": true,
53
- "imports": [
54
- "index.html",
55
- "__plugin-vue_export-helper.js"
56
- ],
57
- "css": [
58
- "assets/AdminLayout.css"
59
- ]
60
- },
61
- "src/views/HomeView.vue": {
62
- "file": "assets/HomeView.js",
63
- "name": "HomeView",
64
- "src": "src/views/HomeView.vue",
65
- "isDynamicEntry": true,
66
- "imports": [
67
- "__plugin-vue_export-helper.js",
68
- "index.html"
69
- ],
70
- "css": [
71
- "assets/HomeView.css"
72
- ]
73
- },
74
- "src/views/NotFoundView.vue": {
75
- "file": "assets/NotFoundView.js",
76
- "name": "NotFoundView",
77
- "src": "src/views/NotFoundView.vue",
78
- "isDynamicEntry": true,
79
- "imports": [
80
- "__plugin-vue_export-helper.js",
81
- "index.html"
82
- ],
83
- "css": [
84
- "assets/NotFoundView.css"
85
- ]
86
- }
87
- }
@@ -1 +0,0 @@
1
- .admin-layout[data-v-0e8c5e22]{display:flex;min-height:100vh;background-color:#f5f7fa}.admin-sidebar[data-v-0e8c5e22]{width:250px;background-color:#2c3e50;color:#fff;display:flex;flex-direction:column}.sidebar-header[data-v-0e8c5e22]{padding:2rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.1)}.sidebar-header h2[data-v-0e8c5e22]{margin:0;font-size:1.5rem}.sidebar-nav[data-v-0e8c5e22]{flex:1;padding:1rem 0}.nav-item[data-v-0e8c5e22]{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;color:#fffc;text-decoration:none;transition:all .3s}.nav-item[data-v-0e8c5e22]:hover{background-color:#ffffff1a;color:#fff}.nav-item.active[data-v-0e8c5e22]{background-color:#3498db;color:#fff;border-right:3px solid #2ecc71}.nav-icon[data-v-0e8c5e22]{font-size:1.2rem}.sidebar-footer[data-v-0e8c5e22]{padding:1.5rem;border-top:1px solid rgba(255,255,255,.1)}.back-link[data-v-0e8c5e22]{color:#fffc;text-decoration:none;transition:color .3s}.back-link[data-v-0e8c5e22]:hover{color:#fff}.admin-content[data-v-0e8c5e22]{flex:1;display:flex;flex-direction:column}.content-header[data-v-0e8c5e22]{background:#fff;padding:1.5rem 2rem;box-shadow:0 2px 4px #0000001a}.content-header h1[data-v-0e8c5e22]{margin:0;font-size:1.5rem;color:#2c3e50}.content-body[data-v-0e8c5e22]{flex:1;overflow-y:auto}
@@ -1 +0,0 @@
1
- import{f as c,u as r,c as _,a as t,d as a,w as o,r as n,t as m,o as u,e as v}from"./index.js";import{_ as p}from"./_plugin-vue_export-helper.js";const f={class:"admin-layout"},k={class:"admin-sidebar"},b={class:"sidebar-nav"},h={class:"sidebar-footer"},x={class:"admin-content"},y={class:"content-header"},w={class:"content-body"},A={__name:"AdminLayout",setup(B){const i=r(),d=c(()=>i.meta.title||"Admin");return(V,s)=>{const e=n("router-link"),l=n("router-view");return u(),_("div",f,[t("aside",k,[s[3]||(s[3]=t("div",{class:"sidebar-header"},[t("h2",null,"Admin Panel")],-1)),t("nav",b,[a(e,{to:"/admin/validation",class:"nav-item","active-class":"active"},{default:o(()=>[...s[0]||(s[0]=[t("span",{class:"nav-icon"},"✓",-1),t("span",null,"Validation",-1)])]),_:1}),a(e,{to:"/admin/customization",class:"nav-item","active-class":"active"},{default:o(()=>[...s[1]||(s[1]=[t("span",{class:"nav-icon"},"🎨",-1),t("span",null,"Customization",-1)])]),_:1})]),t("div",h,[a(e,{to:"/",class:"back-link"},{default:o(()=>[...s[2]||(s[2]=[v(" ← Back to Home ",-1)])]),_:1})])]),t("main",x,[t("div",y,[t("h1",null,m(d.value),1)]),t("div",w,[a(l)])])])}}},g=p(A,[["__scopeId","data-v-0e8c5e22"]]);export{g as default};
@@ -1 +0,0 @@
1
- .customization-view[data-v-98b51b90]{padding:2rem}
@@ -1 +0,0 @@
1
- import{_ as e}from"./_plugin-vue_export-helper.js";import{c as s,a as t,o as a}from"./index.js";const i={class:"customization-view"},n={__name:"CustomizationView",setup(r){return(c,o)=>(a(),s("div",i,[...o[0]||(o[0]=[t("h2",null,"Customization Module",-1),t("p",null,"Customization feature content goes here.",-1)])]))}},m=e(n,[["__scopeId","data-v-98b51b90"]]);export{m as default};
@@ -1 +0,0 @@
1
- .home-view[data-v-5f5b770d]{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:2rem}.hero[data-v-5f5b770d]{text-align:center;margin-bottom:4rem}.hero h1[data-v-5f5b770d]{font-size:3rem;margin-bottom:1rem}.hero p[data-v-5f5b770d]{font-size:1.5rem;margin-bottom:2rem;opacity:.9}.cta-buttons[data-v-5f5b770d]{display:flex;gap:1rem;justify-content:center}.btn[data-v-5f5b770d]{padding:1rem 2rem;border-radius:8px;text-decoration:none;font-weight:600;transition:all .3s;display:inline-block}.btn-primary[data-v-5f5b770d]{background-color:#fff;color:#667eea}.btn-primary[data-v-5f5b770d]:hover{transform:translateY(-2px);box-shadow:0 8px 16px #0003}.features[data-v-5f5b770d]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:2rem;max-width:1200px;width:100%}.feature-card[data-v-5f5b770d]{background:#ffffff1a;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:2rem;border-radius:12px;text-align:center;transition:all .3s}.feature-card[data-v-5f5b770d]:hover{transform:translateY(-5px);background:#ffffff26}.feature-icon[data-v-5f5b770d]{font-size:3rem;margin-bottom:1rem}.feature-card h3[data-v-5f5b770d]{font-size:1.5rem;margin-bottom:1rem}.feature-card p[data-v-5f5b770d]{opacity:.9}
@@ -1 +0,0 @@
1
- import{_ as o}from"./_plugin-vue_export-helper.js";import{c as d,a as t,b as s,d as i,w as n,r,o as l,e as c}from"./index.js";const v={class:"home-view"},f={class:"hero"},u={class:"cta-buttons"},m={__name:"HomeView",setup(p){return(b,a)=>{const e=r("router-link");return l(),d("div",v,[t("div",f,[a[1]||(a[1]=t("h1",null,"Welcome to DNA ATD Frontend",-1)),a[2]||(a[2]=t("p",null,"A modern Vue 3 application with feature-based architecture",-1)),t("div",u,[i(e,{to:"/admin",class:"btn btn-primary"},{default:n(()=>[...a[0]||(a[0]=[c(" Go to Admin Panel ",-1)])]),_:1})])]),a[3]||(a[3]=s('<div class="features" data-v-5f5b770d><div class="feature-card" data-v-5f5b770d><div class="feature-icon" data-v-5f5b770d>✓</div><h3 data-v-5f5b770d>Validation Management</h3><p data-v-5f5b770d>Manage and configure validation rules for your application</p></div><div class="feature-card" data-v-5f5b770d><div class="feature-icon" data-v-5f5b770d>🎨</div><h3 data-v-5f5b770d>UI Customization</h3><p data-v-5f5b770d>Customize themes, colors, and layout settings</p></div></div>',1))])}}},h=o(m,[["__scopeId","data-v-5f5b770d"]]);export{h as default};
@@ -1 +0,0 @@
1
- .not-found[data-v-a7268e29]{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2rem}.not-found h1[data-v-a7268e29]{font-size:6rem;margin:0;color:#3498db}.not-found h2[data-v-a7268e29]{font-size:2rem;margin:1rem 0;color:#2c3e50}.not-found p[data-v-a7268e29]{font-size:1.2rem;color:#7f8c8d;margin-bottom:2rem}.btn[data-v-a7268e29]{background-color:#3498db;color:#fff;padding:1rem 2rem;border-radius:4px;text-decoration:none;transition:all .3s}.btn[data-v-a7268e29]:hover{background-color:#2980b9}
@@ -1 +0,0 @@
1
- import{_ as n}from"./_plugin-vue_export-helper.js";import{c as s,a as e,d as r,w as a,r as l,o as d,e as u}from"./index.js";const p={class:"not-found"},i={__name:"NotFoundView",setup(_){return(m,o)=>{const t=l("router-link");return d(),s("div",p,[o[1]||(o[1]=e("h1",null,"404",-1)),o[2]||(o[2]=e("h2",null,"Page Not Found",-1)),o[3]||(o[3]=e("p",null,"The page you're looking for doesn't exist.",-1)),r(t,{to:"/",class:"btn"},{default:a(()=>[...o[0]||(o[0]=[u("Go Home",-1)])]),_:1})])}}},N=n(i,[["__scopeId","data-v-a7268e29"]]);export{N as default};
@@ -1 +0,0 @@
1
- .validation-view[data-v-7eb680e6]{padding:2rem}
@@ -1 +0,0 @@
1
- import{_ as o}from"./_plugin-vue_export-helper.js";import{c as t,a,o as i}from"./index.js";const n={class:"validation-view"},s={__name:"ValidationView",setup(l){return(r,e)=>(i(),t("div",n,[...e[0]||(e[0]=[a("h2",null,"Validation Module",-1),a("p",null,"Validation feature content goes here.",-1)])]))}},d=o(s,[["__scopeId","data-v-7eb680e6"]]);export{d as default};
@@ -1 +0,0 @@
1
- const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};
@@ -1 +0,0 @@
1
- *{margin:0;padding:0;box-sizing:border-box}#app{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}:root{--primary-color: #3498db;--secondary-color: #2c3e50;--success-color: #2ecc71;--danger-color: #e74c3c;--warning-color: #f39c12;--info-color: #3498db;--light-color: #ecf0f1;--dark-color: #2c3e50;--base-font-size: 16px;--border-radius: 4px;--box-shadow: 0 2px 4px rgba(0,0,0,.1);--transition: all .3s ease}[data-theme=dark]{--primary-color: #3498db;--secondary-color: #ecf0f1;--bg-color: #1a1a1a;--text-color: #ecf0f1;--border-color: #333}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#555}