حالت کارگاه
#/p/:id/workshop — روی گوشی، برای اجرا نه طراحی: قطعهها تحویل گرفته و
شمرده میشوند، برچسبها اسکن، یونیتها گام به گام مونتاژ. آفلاین کامل؛ همان
پروژهٔ Dexie و همان .darz.
پوسته (W1)
Section titled “پوسته (W1)”apps/web/src/app/WorkshopPage.tsx با همان ProjectGate ِ ویرایشگر (useProject، و ProjectSession
برای قفل و ذخیرهٔ خودکار) پروژه را میآورد و تا باز است پوستهٔ workshop (روشن، قلم ۱۶، هدف لمسی ۴۸) را روی
سند میگذارد؛ با رفتن، انتخاب کاربر برمیگردد. سه تب زیرِ سرصفحه روی Tabs ِ کیت
(fill): قطعات، برچسب، مونتاژ. صفحه بلندیِ ثابتِ 100dvh دارد و فقط پنلِ تب میپیماید — نوارِ
دستسازِ پیشینِ پایین تهِ سند بود و چون body پیمایش ندارد، با فهرستِ بلند دستنیافتنی میماند
(e2e/workshop.spec.ts با toBeInViewport و چرخ). سرصفحه خلاصهٔ پیشرفت را میگوید (progressSummary).
قطعات (W2)
Section titled “قطعات (W2)”PartsTab: ردیفهای لیست برش (merged) به تفکیک جنس، هر ردیف با شمارندهٔ
تحویل «n از qty» و دکمههای ± لمسی؛ وضعیت ناقص/کامل/زیاد از rowStatus؛
جستوجو روی نام و اندازه. شمارش تا دو برابر تعداد بالا میرود تا «زیاد آمده»
هم ثبت شود.
برچسب و اسکن (W3)
Section titled “برچسب و اسکن (W3)”ScanTab + useScanner: دوربین پشت با getUserMedia؛ خواندن قاب هر ۲۵۰
میلیثانیه با BarcodeDetector اگر مرورگر دارد، وگرنه jsqr (بارگذاری تنبل)
روی پیکسلهای قاب. همان کد تا سه ثانیه دوباره ثبت نمیشود. پشتیبان همیشگی:
چسباندن لینک برچسب یا شناسهٔ قطعه. parsePartUrl (بازصادرِ parsePartRef از @darzsaz/report/part-ref)
نشانیِ نسخهدارِ برچسبِ امروز، darzsaz:1/p/<projectId>/part/<partId>، و شکلِ قدیمِ بی شمارهٔ برچسبهای
چاپشده (لینکِ کاملِ اپ یا همان مسیر با darzsaz:#) را میخواند؛ برچسب پروژهٔ دیگر رد میشود. اگر دوربین
گوشی چنین لینکِ کاملِ قدیمی را باز کند، ?part= در نشانی همان تکه را ثبت میکند. اسکن → scanPiece: تکهٔ تازه
یک واحد به ردیفش میافزاید، تکراری فقط گزارش میشود؛ برگهٔ قطعه: یونیت،
اندازه، جنس، لبههای نواردار، تحویل ردیف.
مونتاژ (W4)
Section titled “مونتاژ (W4)”AssemblyTab: یونیت را انتخاب کن (با پیشرفت هر یونیت در فهرست)، گامهای
assemblySteps با تیک؛ تیک گام k یعنی گامهای ۱ تا k تمام؛ «تمام شد» و
«از اول». عنوان، دستور و هشدارِ هر گام پیامِ هستهاند (AssemblyStep.title: Msg، body: Msg[]، tip?: Msg، متن در
core/assembly/step-messages.ts) و به زبانِ رابط رندر میشوند؛ یراقِ گام نامِ کاتالوگ (plain) و واحدِ
کلید ('piece' | 'pair' | 'meter') دارد و برگهٔ مونتاژ مقدار و واحد را به زبانِ سند مینویسد.
پیشرفت در پروژه (W5)
Section titled “پیشرفت در پروژه (W5)”project.workshop?: WorkshopProgress در هسته (packages/core/src/workshop/progress.ts):
counted (ردیف → تعداد تحویل)، pieces (تکهٔ فیزیکی اسکنشده)، steps
(یونیت → گامهای تمامشده)، updatedAt. توابع خالص و آزموندار: deliver،
scanPiece، setSteps، rowStatus، progressSummary. هر تغییر از edit()
میگذرد، پس واگرد و ذخیرهٔ خودکار دارد و با .darz جابهجا میشود.
باز کردن .darz از واتساپ (W6)
Section titled “باز کردن .darz از واتساپ (W6)”مانیفست share_target (POST، multipart/form-data، پارامتر file).
public/share-target-sw.js با importScripts کنار Workbox مینشیند: POST را
میگیرد، پرونده را در Cache darzsaz-share میگذارد و به #/share میفرستد؛
SharePage با takeSharedFile برمیدارد (که از Cache پاکش میکند) و با openFile ِ
useOpenProjectFile (همان مسیرِ باز کردنِ خانه و منوی ویرایشگر) باز میکند. ⚠️ فقط در حالت نصبشدهٔ PWA روی اندروید کار میکند؛
iOS share_target ندارد.