mohaymen-notepad-module 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,307 @@
1
+
2
+ # Definition of Done (DOD) - ماژول نوت‌پد (فقط فاز اول)
3
+
4
+ ## 1. معرفی و دامنه
5
+
6
+ - **نام پروژه:** ماژول نوت‌پد برای سامانه ستاره
7
+ - **نوع پروژه:** برون‌سپاری (Frontend)
8
+ - **فاز پوشش‌داده‌شده در این سند:** فقط **فاز اول – قابلیت‌های اصلی (Go-Live)**
9
+
10
+ این سند، DOD اختصاصی فاز اول است و فقط مواردی را پوشش می‌دهد که برای راه‌اندازی عملیاتی (Go-Live) ماژول نوت‌پد لازم هستند.
11
+
12
+ ---
13
+
14
+ ## 2. دامنه فاز اول (Scope)
15
+
16
+ در پایان فاز اول، ماژول نوت‌پد باید حداقل قابلیت‌های زیر را به‌صورت کامل و قابل استفاده در محیط واقعی داشته باشد:
17
+
18
+ - **ماژول مستقل نوت‌پد در سامانه ستاره**
19
+ - **ویرایشگر متن مبتنی بر Tiptap** با امکانات ادیت متن تعریف‌شده
20
+ - **مدیریت دسترسی View/Edit** در UI
21
+ - **دریافت و ذخیره نوت از طریق Context API**
22
+ - **افزودن گزارش‌های PA** از طریق Web Component
23
+ - **منشن کردن داشبوردهای PA در متن** (Mention)
24
+ - **UI/UX مطابق طراحی انجام شده** (شامل RTL/LTR)
25
+ - **State Management با Zustand**
26
+ - **Auto-save با Debounce + Save Notification**
27
+ - **آپلود فایل/تصویر فقط با Browse**
28
+ - **تست Integration با Cypress با حداقل ۸۰٪ پوشش** برای سناریوهای اصلی
29
+
30
+ ---
31
+
32
+ ## 3. معماری و Context API
33
+
34
+ ### 3.1 معماری ماژول
35
+
36
+ - ماژول نوت‌پد به‌صورت یک ماژول مستقل در سامانه ستاره در دسترس است (ورود از منوی ماژول‌ها).
37
+ - هر نوت/داک یک Object مستقل با شناسه یکتا است (برای دریافت/ویرایش/ذخیره).
38
+ - UI برای هر نوت، وضعیت دسترسی کاربر (View یا Edit) را نشان می‌دهد و رفتار را بر اساس آن تنظیم می‌کند.
39
+
40
+ ### 3.2 Context API
41
+
42
+ - تمام ارتباطات با سرور در ماژول نوت‌پد از طریق یک Context (یا چند Context مرتبط) به کامپوننت‌ها تزریق می‌شود.
43
+ - حداقل متدهای زیر در Context در دسترس است:
44
+
45
+ ```typescript
46
+ type AccessLevel = 'none' | 'view' | 'edit';
47
+
48
+ interface NotepadContextAPI {
49
+ getNote: (noteId: string) => Promise<Note>;
50
+ updateNote: (noteId: string, content: any) => Promise<void>;
51
+
52
+ // گزارش‌ها
53
+ getReportsList: () => Promise<Array<{ id: string; title: string; type: string }>>;
54
+
55
+ // داشبوردها (برای منشن کردن در نوت)
56
+ getDashboardsList: () => Promise<Array<{ id: string; title: string }>>;
57
+
58
+ uploadFile: (file: File) => Promise<{ url: string }>;
59
+
60
+ // بررسی دسترسی:
61
+ // مقدار برگشتی یک اینام متنی است که نشان می‌دهد کاربر هیچ دسترسی ندارد، فقط خواندن دارد یا دسترسی ویرایش دارد.
62
+ // 'none' → کاربر هیچ دسترسی به نوت ندارد
63
+ // 'view' → کاربر فقط دسترسی خواندن دارد
64
+ // 'edit' → کاربر دسترسی ویرایش (و به‌صورت ضمنی خواندن) دارد
65
+ hasPermission: () => AccessLevel;
66
+ }
67
+ ```
68
+
69
+ - تمام متدها Promise-base هستند و خطاها به‌صورت مناسب Handle می‌شوند (Error Notifications در UI).
70
+
71
+ ### 3.3 مدیریت دسترسی در UI
72
+
73
+ - اگر کاربر **دسترسی View ندارد**:
74
+ - نوت نمایش داده نمی‌شود (یا پیام مناسب نمایش داده می‌شود) مطابق سیاست محصول.
75
+ - Notification مناسب با متن عدم دسترسی نمایش داده می‌شود.
76
+
77
+ - اگر کاربر **فقط View دارد و Edit ندارد**:
78
+ - محتوای نوت نمایش داده می‌شود، اما قابل ویرایش نیست.
79
+ - ویرایشگر در حالت Read-Only قرار می‌گیرد.
80
+ - NotepadToolbar غیرفعال یا مخفی می‌شود (طبق طراحی انجام شده).
81
+ - آیکن قفل یا Badge وضعیت Read-Only نشان داده می‌شود.
82
+
83
+ - اگر کاربر **دسترسی Edit دارد**:
84
+ - تمام امکانات ویرایش فعال هستند.
85
+
86
+ ---
87
+
88
+ ## 4. ویرایشگر متن (Tiptap) – فاز اول
89
+
90
+ ### 4.1 امکانات ادیت متن
91
+
92
+ در فاز اول، ویرایشگر متن باید حداقل امکانات زیر را داشته باشد:
93
+
94
+ - **تعیین اندازه متن** از بین:
95
+ - H1
96
+ - H2
97
+ - Body
98
+
99
+ - **تعیین رنگ متن** (Text Color)
100
+ - **هایلایت کردن متن** (Text Highlight)
101
+ - **استایل متن**:
102
+ - Bold
103
+ - StrikeThrough
104
+ - Italic
105
+
106
+ - **لیست‌ها**:
107
+ - Ordered List
108
+ - Unordered List
109
+ - ToDo List (Check Box)
110
+
111
+ - **درج عناصر**:
112
+ - Add Link to Text (Create Link) – افزودن لینک به بخشی از متن انتخاب‌شده
113
+ - Insert Table – درج جدول
114
+ - Insert Photo – درج تصویر از طریق Browse
115
+ - Insert Media – درج فایل‌های رسانه‌ای، در حدی که در طراحی انجام شده آمده است
116
+
117
+ ### 4.2 Page Break (Paging)
118
+
119
+ - استفاده از Tiptap به‌همراه اکستنشن **Pagination Plus / Page Size** برای پیاده‌سازی قابلیت جداسازی صفحات:
120
+ - مرجع: `https://tiptapplus.com/pagination-plus/page-size/`
121
+ - این اکستنشن مسئول مدیریت Page Break و اندازه صفحات در ادیتور است.
122
+ - قابلیت درج Page Break در متن.
123
+ - نمایش جداکننده صفحه در ادیتور (Line/Separator) مطابق طراحی انجام شده.
124
+ - امکان حذف Page Break.
125
+
126
+ **گزینه‌های جایگزین (در صورت عدم امکان استفاده از اکستنشن فوق):**
127
+
128
+ - استفاده از یکی از اکستنشن‌های Community مانند:
129
+ - `tiptap-extension-page-break` (NPM)
130
+ - `@sereneinserenade/tiptap-page-break` (GitHub: `sereneinserenade/tiptap-extensions`)
131
+ - یا پیاده‌سازی یک **Custom Page Break Extension** بر اساس مستندات رسمی Tiptap.
132
+
133
+ ### 4.3 NotepadToolbar
134
+
135
+ - NotepadToolbar ویرایشگر باید **از لحاظ ظاهر و گروه‌بندی دکمه‌ها مطابق طراحی انجام شده** باشد:
136
+ - دکمه‌های مربوط به اندازه متن، استایل متن، رنگ، هایلایت و لیست‌ها.
137
+ - دکمه‌های درج (Link, Table, Photo, Media, Page Break).
138
+ - Tooltip برای هر دکمه.
139
+ - نمایش وضعیت فعال/غیرفعال (Active/Disabled) برای دکمه‌ها.
140
+
141
+ ### 4.4 RTL / LTR
142
+
143
+ - ادیتور باید بدون نیاز به دکمه تغییر جهت، از RTL و LTR پشتیبانی کند:
144
+ - در متن فارسی/عربی، چیدمان RTL و راست‌چین باشد.
145
+ - در متن انگلیسی، چیدمان LTR و چپ‌چین باشد.
146
+ - NotepadToolbar و سایر اجزا در RTL به‌درستی Mirror شوند و دچار به‌هم‌ریختگی نشوند.
147
+ - محتوای Mixed (فارسی+انگلیسی) بدون مشکل نمایش داده شود.
148
+ - برای مدیریت جهت متن و پاراگراف‌ها، پیشنهاد می‌شود از اکستنشن **`tiptap-text-direction`** استفاده شود
149
+ (مرجع: `https://github.com/amirhhashemi/tiptap-text-direction`).
150
+
151
+ ---
152
+
153
+ ## 5. گزارش‌های PA (Web Component)
154
+
155
+ ### 5.1 انتخاب و درج گزارش
156
+
157
+ - امکان دریافت لیست گزارش‌ها از سرور از طریق Context:
158
+ - شامل حداقل: `id` و `title` (و `type` در صورت نیاز).
159
+ - UI ساده برای انتخاب گزارش از لیست (طبق طراحی انجام شده).
160
+ - پس از انتخاب، در محتوای نوت یک Web Component درج می‌شود، مانند:
161
+
162
+ ```html
163
+ <report-component reportId="xxx"></report-component>
164
+ ```
165
+
166
+ ### 5.2 ذخیره و بازیابی
167
+
168
+ - `reportId` و ساختار Web Component در محتوای نوت ذخیره می‌شود (HTML/JSON).
169
+ - هنگام لود نوت، Web Component ها مجدداً رندر می‌شوند.
170
+ - امکان حذف گزارش از داخل نوت (حذف Web Component از متن) وجود دارد.
171
+
172
+ ### 5.3 Slash Menu و منشن داشبورد PA
173
+
174
+ - در ویرایشگر، یک **Slash Menu** (منوی `/`) وجود دارد که کاربر با تایپ `/` می‌تواند گزینه‌های درج محتوا را ببیند.
175
+ - حداقل دو آیتم زیر باید در Slash Menu موجود باشد:
176
+ - **افزودن گزارش PA** (Add PA Report)
177
+ - **منشن داشبورد PA** (Mention PA Dashboard)
178
+ - برای آیتم **افزودن گزارش PA** می‌توان از همان لیست گزارش‌ها و Web Component توضیح‌داده‌شده در این بخش استفاده کرد.
179
+
180
+ #### منشن داشبورد PA
181
+
182
+ - لیست داشبوردها از طریق متد `getDashboardsList` در Context دریافت می‌شود (شامل حداقل `id` و `title`).
183
+ - پس از انتخاب گزینه «منشن داشبورد PA» از Slash Menu، لیست داشبوردها نمایش داده می‌شود و کاربر می‌تواند یک داشبورد را انتخاب کند.
184
+ - در متن، یک Mention (مثلاً به‌صورت تگ/Chip یا متن فرمت‌شده) درج می‌شود که `dashboardId` را در ساختار داده خود نگه می‌دارد و قابل کلیک/ارجاع است (رفتار دقیق مطابق طراحی انجام شده).
185
+ - Mentionهای داشبورد همراه با `dashboardId` در ساختار داده نوت ذخیره و هنگام لود مجدداً رندر می‌شوند.
186
+
187
+ ---
188
+
189
+ ## 6. UX/UI، Shortcutها و Read-Only
190
+
191
+ ### 6.1 Keyboard Shortcuts (فاز اول)
192
+
193
+ - Ctrl+B → Bold
194
+ - Ctrl+I → Italic
195
+ - Ctrl+K → Add Link
196
+ - Ctrl+S → ذخیره دستی (Manual Save)
197
+
198
+ ### 6.2 Save Notification و Auto-save
199
+
200
+ - Auto-save با Debounce (مثلاً حدود ۲ ثانیه بعد از آخرین تغییر).
201
+ - نمایش وضعیت ذخیره‌سازی در UI:
202
+ - `Saving...` هنگام ارسال تغییرات.
203
+ - `Saved` بعد از موفقیت.
204
+ - نمایش `Last saved at ...` (آخرین زمان ذخیره).
205
+ - در صورت خطای ذخیره، پیام خطای واضح نمایش داده می‌شود.
206
+
207
+ ### 6.3 Loading & Error States
208
+
209
+ - هنگام **بارگذاری اولیه نوت**:
210
+ - نمایش Skeleton/Spinner تا دریافت داده.
211
+ - هنگام **Auto-save**:
212
+ - نمایش وضعیت در NotepadToolbar یا جای مناسب (Loading/Spinner کوچک).
213
+ - هنگام **درج گزارش**:
214
+ - نمایش Loading تا تکمیل عملیات درج.
215
+ - هنگام **آپلود فایل/تصویر (Browse)**:
216
+ - نمایش Loading / Progress (در حدی که در طراحی انجام شده آمده است).
217
+ - برای خطاهای زیر، Notification مناسب نمایش داده می‌شود:
218
+ - عدم دسترسی (403)
219
+ - عدم اتصال به سرور / Timeout
220
+ - خطای سرور (۵۰۰)
221
+ - خطای آپلود (حجم/فرمت نامعتبر، شکست ارسال)
222
+
223
+ ### 6.4 Read-Only Mode
224
+
225
+ - در حالت عدم دسترسی Edit:
226
+ - متن نوت غیرقابل ویرایش است.
227
+ - NotepadToolbar مخفی یا غیرفعال (طبق طراحی انجام شده).
228
+ - یک نشانگر (آیکن قفل یا Badge) وضعیت Read-Only را نمایش می‌دهد.
229
+
230
+ ### 6.5 Responsive Design
231
+
232
+ - نمایش صحیح UI ماژول در:
233
+ - Desktop
234
+ - Tablet
235
+ - Mobile
236
+ - رفتار NotepadToolbar در عرض‌های مختلف مطابق طراحی انجام شده (ممکن است بخشی از دکمه‌ها در منوی بیشتر بروند).
237
+
238
+ ---
239
+
240
+ ## 7. State Management (Zustand)
241
+
242
+ - استفاده از **Zustand** برای State Management ماژول.
243
+ - حداقل دو سطح State:
244
+ - **Note State:** محتوای نوت، وضعیت ذخیره (Saving/Saved/Error)، Page Breakها، گزارش‌های درج‌شده.
245
+ - **UI State:** مود Read-Only، وضعیت Loadingها، نمایش/عدم نمایش دیالوگ‌ها، وضعیت NotepadToolbar.
246
+ - Storeها به صورت ماژولار طراحی شوند تا توسعه فاز دوم (History, Comments, …) آسان باشد.
247
+
248
+ ---
249
+
250
+ ## 8. تست و کیفیت (فقط فاز اول)
251
+
252
+ ### 8.1 Cypress Integration Tests
253
+
254
+ - سناریوهای حداقلی که باید با Cypress پوشش داده شوند:
255
+ - لود نوت و نمایش محتوا.
256
+ - ویرایش متن و ذخیره (Manual Save + Auto-save).
257
+ - نمایش و رفتار Save Notification.
258
+ - حالت Read-Only (عدم امکان ویرایش، نمایش قفل).
259
+ - درج Page Break و حذف آن.
260
+ - درج و حذف Web Component گزارش.
261
+ - آپلود تصویر/فایل با Browse (موفق + خطای حجم/فرمت).
262
+ - Shortcutهای Ctrl+B، Ctrl+I، Ctrl+K، Ctrl+S.
263
+ - **حداقل ۸۰٪ Coverage** برای ماژول نوت‌پد (فاز اول).
264
+
265
+ ### 8.2 تطابق با طراحی و RTL/LTR
266
+
267
+ - UI با طراحی انجام شده از نظر:
268
+ - رنگ، فونت، فاصله‌ها، آیکن‌ها، حالت‌های Hover/Active/Disabled.
269
+ - چیدمان NotepadToolbar و رفتار Responsive.
270
+ - تست در حالت RTL و LTR با محتوای فارسی، عربی و انگلیسی.
271
+
272
+ ---
273
+
274
+ ## 9. Build، Review و چک‌لیست تحویل فاز اول
275
+
276
+ ### 9.1 Build & Deployment
277
+
278
+ - Build production پروژه بدون خطا و Warning اجرا می‌شود.
279
+ - ماژول نوت‌پد در محیط تست/Stage قابل استفاده است و به سامانه ستاره متصل می‌شود.
280
+
281
+ ### 9.2 Reviewها
282
+
283
+ - **Design Review:**
284
+ - تأیید Product Designer مبنی بر تطابق UI با طراحی انجام شده.
285
+ - **Technical Review:**
286
+ - تأیید Tech Lead مبنی بر کیفیت کد، ساختار معماری، استفاده از Zustand و رعایت SOLID در حد معقول.
287
+ - **Product/UAT:**
288
+ - تأیید Product Manager بعد از تست سناریوهای اصلی (ایجاد/ویرایش/ذخیره نوت، درج گزارش، Page Break، Read-Only).
289
+
290
+ ### 9.3 چک‌لیست نهایی فاز اول
291
+
292
+ در زمان تحویل فاز اول، تمام موارد زیر باید ✅ باشند:
293
+
294
+ - ماژول نوت‌پد به‌عنوان ماژول مستقل در سامانه ستاره در دسترس است.
295
+ - Context API برای `getNote`, `updateNote`, `getReportsList`, `uploadFile`, `hasPermission` پیاده‌سازی و در ماژول استفاده می‌شود.
296
+ - ویرایشگر Tiptap با امکانات ادیت متن ذکرشده (H1/H2/Body، رنگ، هایلایت، Bold/Italic/Strike، لیست‌ها، Link, Table, Photo, Media) کار می‌کند.
297
+ - Page Break با اکستنشن رایگان پیاده‌سازی شده و درج/حذف آن در ادیتور بدون مشکل است.
298
+ - RTL/LTR در متن و NotepadToolbar بدون به‌هم‌ریختگی کار می‌کند.
299
+ - گزارش‌ها از طریق Web Component و با `reportId` در نوت درج، ذخیره، لود و حذف می‌شوند.
300
+ - Auto-save با Debounce فعال است و Save Notification (`Saving.../Saved/Last saved at...`) درست کار می‌کند.
301
+ - آپلود فایل/تصویر از طریق Browse (بدون Drag & Drop) کار می‌کند و خطاها مدیریت می‌شود.
302
+ - Read-Only Mode طبق دسترسی کاربر رفتار می‌کند (عدم ویرایش، قفل، غیرفعال بودن NotepadToolbar).
303
+ - Keyboard Shortcuts تعریف‌شده برای فاز اول کار می‌کنند.
304
+ - تست‌های Cypress با حداقل ۸۰٪ Coverage برای سناریوهای فاز اول پاس می‌شوند.
305
+ - Build Production بدون خطا و Warning اجرا شده است.
306
+
307
+
@@ -0,0 +1,39 @@
1
+ import { Context } from 'react';
2
+ import { JSONContent } from '@tiptap/react';
3
+ import { JSX } from 'react/jsx-runtime';
4
+
5
+ declare type AccessLevelNotepad = 'none' | 'view' | 'edit';
6
+
7
+ export declare const Notepad: () => JSX.Element;
8
+
9
+ declare type NotepadContent = JSONContent;
10
+
11
+ export declare const NotepadContext: Context<NotepadContextAPI | null>;
12
+
13
+ declare type NotepadContextAPI = {
14
+ getNote: (noteId: string) => Promise<NotepadNode>;
15
+ updateNote: (noteId: string, content: any) => Promise<void>;
16
+ getReportsList: () => Promise<Array<{
17
+ id: string;
18
+ title: string;
19
+ type: string;
20
+ }>>;
21
+ getDashboardsList: (query: string | null) => Promise<NotepadReportType[]>;
22
+ uploadFile: (file: File) => Promise<{
23
+ url: string;
24
+ }>;
25
+ hasAccess: (noteId: string) => Promise<AccessLevelNotepad>;
26
+ autoSaveInterval: () => number;
27
+ };
28
+
29
+ declare type NotepadNode = {
30
+ id: string;
31
+ content: NotepadContent;
32
+ };
33
+
34
+ declare type NotepadReportType = {
35
+ id: string;
36
+ title: string;
37
+ };
38
+
39
+ export { }