עריכת דפים ואלמנטים
ארבעה כלים בונים את גוף הדף: אחד יוצר דף כרטיס, אחד עורך את הגריד ואת השדות, אחד מייצר מיכל, ואחד משכפל אלמנט קיים.
לפני כולם — Get-Page-Content. כל פרמטר בעמוד הזה שמסתיים ב‑Row, Column או ElemId מקבל מזהה שנקרא משם.
סדר הבנייה הסטנדרטי
Section titled “סדר הבנייה הסטנדרטי”Create-Table ← הטבלה והשדות חייבים להתקיים קודם ↓Create-Form-Page דף כרטיס ריק ↓Edit-Page (add-row) פותחים שורות ↓Edit-Page (add-new-field) ממלאים אותן בשדות ↓Create-Table-View-Page דף הרשימה, שמפנה לכרטיס ↓Get/Edit-Form-Rules התנהגות דינמיתכל חריגה מהסדר הזה עולה בעבודה חוזרת: שדה בלי סכימה מתקבל בשקט ולא שומר (ראו המלכודת הראשונה), שדה בלי שורה נכשל, ודף רשימה בלי כרטיס נפתח על טופס inline במקום על הכרטיס שבניתם.
Create-Form-Page
Section titled “Create-Form-Page”יוצר דף כרטיס לטבלה — דף ריק, בלי שדות.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
tableName |
String | ✔ | המחלקה שהטופס נקשר אליה |
pageName |
String | ✔ | הנתיב. מוסכמה: יחיד, למשל apps/mybusiness/Supplier |
title |
String | ✔ | הכותרת בעברית. נכתבת גם כשורת ה‑H2 בראש הדף |
siteId |
String | האתר |
{ "tableName": "Suppliers", "pageName": "apps/mybusiness/Supplier", "title": "פרטי ספק" }התשובה היא { "pageId": "<24 hex>" }. מה שמתקבל: טופס ריק על המאסטר NewMaster, עם שורת כותרת (H2 עם ה‑title) ועוד שורה ריקה אחת בפריסת [6,6] שנושאת את המחלקה ai-placeHolder, ושורת footer עם כפתורי השמירה. זו השורה שממלאים ראשונה — במערכת vanilla המזהים שלה הם P272 (השורה) ו‑P268 (הטופס), אבל אל תקבעו אותם: קראו אותם מ‑Get-Page-Content.
המאסטר נקבע כאן ולתמיד — ראו דפי מאסטר.
Edit-Page
Section titled “Edit-Page”כלי העבודה של הגריד והשדות. מקבל מערך פעולות מסודר שמבוצע לפי הסדר.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | ה‑_id של הדף |
actions |
Array<Object> | ✔ | הפעולות. לכל פעולה actionType חובה |
siteId |
String | האתר |
עשר הפעולות
Section titled “עשר הפעולות”ה‑enum של הסכימה החיה מכיל עשר פעולות:
actionType |
מה היא עושה | הפרמטרים המרכזיים |
|---|---|---|
add-row |
שורה חדשה בגריד | columnSize, ואז newRowAfterRow או toExistingRow+toExistingColumn (שורה מקוננת) |
edit-row |
משנה את פריסת העמודות של שורה | toExistingRow, columnSize |
delete-row |
מוחק שורה — גם שורה מלאה, בלי אזהרה | toExistingRow. ודאו בעצמכם שהיא ריקה |
add-new-field |
מציב שדה מהסכימה על הטופס | fieldName, fieldType, label, targetClass, מיקום, isRequired, defaultValue, autocomplete, subclassDepend |
move-existing-field |
מזיז שדה קיים | fieldName + פרמטרי מיקום |
move-existing-object |
מזיז כל אלמנט לפי מזהה | fieldName = מזהה האלמנט (למשל "P47") + יעד: toExistingRow+toExistingColumn, newRowAfterRow (נוח להזזת שורה), או intoExistingElemId |
change-existing-field-label |
משנה את תווית השדה בדף הזה | fieldName, label |
set-field-required |
חובה / לא חובה | fieldName, isRequired |
remove-existing-field |
מוריד שדה מהדף (נשאר ב‑DB) | fieldName |
set-html-content |
מחליף את כל התוכן הפנימי של אלמנט קיים ב‑HTML | htmlContent + intoExistingElemId — שניהם נדרשים |
פרמטרי המיקום
Section titled “פרמטרי המיקום”שלוש דרכים למקם, וכל פעולה שמציבה משהו משתמשת באחת מהן:
| הפרמטרים | המשמעות |
|---|---|
toExistingRow + toExistingColumn |
לשורה קיימת, לעמודה מסוימת. העמודות הן 0‑based |
newRowAfterRow |
יוצר שורה חדשה אחרי השורה הנתונה ומניח שם את האלמנט |
intoExistingElemId |
לתוך אלמנט קיים (למשל מיכל). לא אלמנט עם המחלקה rDivider |
columnSize הוא מערך שסכומו 12:
| הפריסה | columnSize |
מתי |
|---|---|---|
| 3 עמודות | [4,4,4] |
שורת שדות ברירת מחדל |
| 2 עמודות | [6,6] |
תוויות ארוכות, שדות רחבים |
| רוחב מלא | [12] |
כותרות סקשן, textarea, טבלאות מקושרות |
| 4 עמודות | [3,3,3,3] |
תיבות סימון וסלקטים קצרים |
| רחב + צר | [8,4] · [9,3] |
תיאור + שדה צדדי |
הפרמטרים בגוף הפעולה
Section titled “הפרמטרים בגוף הפעולה”| הפרמטר | טיפוס | המשמעות |
|---|---|---|
fieldName |
String | שם השדה — או, ב‑move-existing-object, מזהה האלמנט |
fieldType |
String | String · Number · Boolean · Date · Array · Object · Pointer |
label |
String | התווית שתוצג בדף הזה |
targetClass |
String | ל‑Pointer (או ל‑Array של Pointers) — המחלקה שאליה מצביעים |
isRequired |
Boolean | שדה חובה |
defaultValue |
String | ערך ברירת מחדל — לשדה חדש בלבד |
autocomplete |
Boolean | הופך שדה Pointer/Array לשדה השלמה אוטומטית במקום רשימה נפתחת |
subclassDepend |
String | רשימה נפתחת מדורגת — ראו למטה |
columnSize |
Array<Number> | פריסת העמודות בשורה |
htmlContent |
String | ל‑set-html-content |
autocomplete — מתי כן
Section titled “autocomplete — מתי כן”רשימה נפתחת שנטענת מטבלה של אלפי רשומות (Accounts, _User) הופכת את הדף לאיטי ואת הבחירה לבלתי אפשרית. autocomplete: true מחליף את ה‑select בשדה חיפוש. לטבלאות lookup קטנות (סטטוסים, סוגים) — השאירו select.
רשימות נפתחות מדורגות
Section titled “רשימות נפתחות מדורגות”הדוגמה מתיאור הכלי: בטופס יש CategoryId שמצביע ל‑Categories, ו‑SubCategoryId שמצביע ל‑SubCategories, כאשר SubCategories מחזיקה שדה Pointer ל‑Categories. אם רוצים שהרשימה של תת‑הקטגוריה תציג רק ערכים ששייכים לקטגוריה שנבחרה — מגדירים על שדה הבן:
{ "actionType": "add-new-field", "fieldName": "SubCategoryId", "fieldType": "Pointer", "targetClass": "SubCategories", "subclassDepend": "Categories", "label": "תת-קטגוריה", "toExistingRow": "P272", "toExistingColumn": 1 }דוגמה — ממלאים את שורת ההתחלה ופותחים את הבאה
Section titled “דוגמה — ממלאים את שורת ההתחלה ופותחים את הבאה”{ "pageId": "69bfd6c945604bc0d35674fb", "actions": [ { "actionType": "add-new-field", "fieldName": "Name", "fieldType": "String", "label": "שם הספק", "isRequired": true, "toExistingRow": "P272", "toExistingColumn": 0 }, { "actionType": "add-new-field", "fieldName": "AccountId", "fieldType": "Pointer", "targetClass": "Accounts", "label": "לקוח", "autocomplete": true, "toExistingRow": "P272", "toExistingColumn": 1 }, { "actionType": "add-row", "columnSize": [6, 6], "newRowAfterRow": "P272" }]}התשובה מחזירה מערך info[], ובו — לכל add-row — ה‑newRowId שנוצר. זה המזהה שממלאים בקריאה הבאה.
כללי סדר הביצוע
Section titled “כללי סדר הביצוע”- קודם יוצרים מקום, אחר כך ממלאים.
add-row, קוראים אתnewRowIdמהתשובה, ואזadd-new-fieldלתוכה. כשיש תלות — קריאות נפרדות. - בדיקת סכימה היא חובה — ורק אתם עושים אותה. הכלי אינו מאמת את
fieldNameמול הסכימה: שדה שאינו ב‑Get-Schemaשל המחלקה מתווסף לדף ב‑success: true. ראו כלי סכימה והמלכודת הראשונה. edit-rowלפני שמזיזים שדות לעמודות חדשות — עמודת היעד חייבת להתקיים.- אצווה עם אותו
newRowAfterRowנכנסת בסדר הפוך. כל שורה חדשה נוחתת מיד אחרי העוגן, ולכן האחרונה במערך היא הראשונה בדף. כדי לקבל כותרת ← שדות ← גרפים, כתבו את הפעולות מלמטה למעלה. - עיצוב מחדש =
move-existing-field, לאadd-new-field. שדה שכבר על הדף יחזירField already exists. - מוציאים שדות ואז
delete-row. מחיקת שורה מאוכלסת מאבדת את מה שבתוכה. - פעולות בלתי תלויות מתאגדות יפה בקריאה אחת.
- שורה מקוננת עובדת בכל עמודה.
add-rowעםtoExistingRow+toExistingColumnנוחתת בעמודה שביקשתם — גם בעמודה 1 ומעלה (באג מאפריל 2026 שקונן שגוי בעמודות ≥ 1 אומת כמתוקן ב‑23.08.2026). השורה המקוננת מקבלתnewRowIdמשלה ב‑info[].
דפוס הסקשן
Section titled “דפוס הסקשן”כרטיס קריא הוא חזרה על אותה תבנית: שורת כותרת [12] עם H2 ← שורות שדות [4,4,4] ← הכותרת הבאה. סדר מומלץ: זהות וסטטוס למעלה, פרטי התקשרות, תאריכים ומטא, טקסט חופשי ברוחב מלא, וטבלאות מקושרות בתחתית.
// אחרי add-row עם [12] שהחזירה rowId{ "pageId": "<id>", "elemType": "H2", "html": "<font color=\"#3249b3\" style=\"font-size: 24px;\">פרטי התקשרות</font>", "rowId": "P280", "columnNumber": 0 }(זו קריאה ל‑Add-Edit-Text-Element.) שמות סקשן חייבים להיות ספציפיים — לעולם לא “פרטים נוספים”.
Add-Container-to-Page
Section titled “Add-Container-to-Page”יוצר מיכל ריק — containerHolder > container — שנותן לאלמנטים שבתוכו את מראה הכרטיס הלבן עם המסגרת והצל.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף |
toExistingRow |
String | * | שורה קיימת. דורש גם toExistingColumn |
toExistingColumn |
Number | מספר העמודה, 0‑based | |
afterElement |
String | * | מזהה אלמנט — המיכל ייווצר אחריו |
intoExistingElemId |
String | * | לתוך אלמנט קיים. לא rDivider |
isFullWidth |
Boolean | רוחב מלא של הדף או של מיכל האב | |
isFullHeight |
Boolean | גובה מינימלי של 100% מהמסך | |
siteId |
String | האתר |
* שלוש דרכי המיקום הן חלופיות — בוחרים אחת.
{ "pageId": "<id>", "toExistingRow": "P221", "toExistingColumn": 0, "isFullWidth": false, "isFullHeight": false }התשובה מחזירה שני מזהים:
{ "success": true, "pageId": "<id>", "info": [ { "actionType": "add-container", "newContainerId": "P292", "innerContainerId": "P293" } ] }newContainerId הוא המעטפת (containerHolder), innerContainerId הוא הכרטיס הלבן עצמו (container). innerContainerId הוא מה שמעבירים כ‑intoExistingElemId לכלי המונים, הגרפים והלשוניות — אלמנט שמוכנס ל‑newContainerId נוחת מחוץ לכרטיס, אחרי המיכל הפנימי. זו הדרך היחידה לקבל אלמנט דשבורד שנראה כמו האלמנטים המקוריים ולא כמו טקסט חשוף על הרקע. ראו אלמנטי דשבורד.
הכלי אינו מסרב ל‑intoExistingElemId של שורה (rDivider) — הוא פשוט מציב את המיכל כאח של העמודות, מחוץ לגריד. האזהרה שבסכימה היא באחריותכם.
Duplicate-Element
Section titled “Duplicate-Element”משכפל אלמנט קיים במקומו: העותק נכנס מיד אחרי המקור, בתוך אותה עמודה או אותו מיכל, ומקבל — הוא וכל צאצאיו — מזהים חדשים וייחודיים. המקור לא נוגע.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
pageId |
String | ✔ | הדף |
elemId |
String | ✔ | האלמנט לשכפול. חייב לשאת את המחלקה simblaEL |
siteId |
String | האתר |
השכפול מעתיק הכול: מבנה, מחלקות CSS, סגנונות inline, ו‑data‑attributes. שדה משוכפל שומר על ה‑name שלו; מונה משוכפל שומר על data-simbla-class, data-counter-function, data-criteria והפורמט; טבלה משוכפלת שומרת על העמודות שלה.
דפוס שכפל‑ואז‑ערוך
Section titled “דפוס שכפל‑ואז‑ערוך”1. Duplicate-Element(pageId, elemId) העותק נוצר ליד המקור2. Get-Page-Content(pageId, minimal:false) קוראים את המזהים החדשים של העותק3. הכלי המתאים עם elemId של העותק ממקדים אותו מחדשזה בדרך כלל מהיר ובטוח יותר מבנייה מאפס כשכבר קיים אלמנט דומה: מונה חדש שנבנה מאפס דורש tableName, counterFunction, criteria, format, css ומיקום; מונה משוכפל דורש רק את מה שמשתנה. עובד על כל סוג אלמנט — שורות טופס, מיכלים, מונים, גרפים, לשוניות, טבלאות תצוגה וטקסט.
שתי המלכודות
Section titled “שתי המלכודות”1. שדה חייב להתקיים בסכימה לפני שמוסיפים אותו לדף
Section titled “1. שדה חייב להתקיים בסכימה לפני שמוסיפים אותו לדף”add-new-field אינו יוצר שדה, ואינו בודק שהשדה קיים. הוא מציב על הטופס כל fieldName שתיתנו לו — גם שדה שאינו בסכימה — ומחזיר success: true. התוצאה היא שדה שנראה על הדף ולא שומר כלום (או, כשה‑CLP של addField פתוח, עמודה חדשה שנוצרת בשקט ב‑DB בשמירה הראשונה). תיאור הכלי אומר את זה במילים אחרות: “Before adding a field, ensure that the field exists in the database schema” — הבדיקה עליכם. מזהה באג: mcp-c-06.
הרצף הנכון: Add-Field-to-Table ← Get-Schema לאימות ← Edit-Page.
2. הסרה מדף אינה מחיקה מהסכימה
Section titled “2. הסרה מדף אינה מחיקה מהסכימה”remove-existing-field מוריד את השדה מה‑HTML של הדף. השדה, והנתונים שבו, נשארים ב‑DB — והוא ימשיך להופיע ב‑Get-Schema, ב‑Get-Optional-Fields ובבורר העמודות של טבלאות התצוגה.
זו התנהגות נכונה (אין מחיקה בשוגג של נתונים), אבל היא מפילה שתי ציפיות: “הורדתי אותו מהדף אז הוא נעלם” — לא נכון; ו“אני צריך למחוק את השדה” — זה קיים רק בממשק הניהול או ב‑REST עם Master Key, ומוחק גם את הנתונים.
אזהרות נוספות
Section titled “אזהרות נוספות”- אין
Delete-Element. אלמנט שלא רוצים מסתירים ב‑CSS (#elemId{display:none!important}) או מוחקים את השורה כולה כשהיא מתפנה. - כל עריכת דף דורשת רענון בדפדפן כדי להופיע. אחרי שינוי בקובץ JS/CSS חיצוני — רענון קשיח (Ctrl+F5).
- גבו לפני שינוי גדול. גרסאות הדף הן מנגנון ה‑undo היחיד.
- אתרים ודפים — קריאה — מאיפה מגיעים כל המזהים בעמוד הזה
- הגדרות דף, קוד וגרסאות — כותרת, הרשאות פתיחה, CSS/JS וגיבוי
- אלמנטי דשבורד — מה מכניסים למיכל שיצרתם
- טבלאות תצוגה ודפי רשימה · חוקי טופס
- כלי סכימה — טבלאות ושדות · אינדקס הכלים המלא