דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

עריכת דפים ואלמנטים

עודכן 30.08.2026

ארבעה כלים בונים את גוף הדף: אחד יוצר דף כרטיס, אחד עורך את הגריד ואת השדות, אחד מייצר מיכל, ואחד משכפל אלמנט קיים.

לפני כולם — Get-Page-Content. כל פרמטר בעמוד הזה שמסתיים ב‑Row, Column או ElemId מקבל מזהה שנקרא משם.

Create-Table ← הטבלה והשדות חייבים להתקיים קודם
Create-Form-Page דף כרטיס ריק
Edit-Page (add-row) פותחים שורות
Edit-Page (add-new-field) ממלאים אותן בשדות
Create-Table-View-Page דף הרשימה, שמפנה לכרטיס
Get/Edit-Form-Rules התנהגות דינמית

כל חריגה מהסדר הזה עולה בעבודה חוזרת: שדה בלי סכימה מתקבל בשקט ולא שומר (ראו המלכודת הראשונה), שדה בלי שורה נכשל, ודף רשימה בלי כרטיס נפתח על טופס inline במקום על הכרטיס שבניתם.

יוצר דף כרטיס לטבלה — דף ריק, בלי שדות.

הפרמטר טיפוס חובה המשמעות
tableName String המחלקה שהטופס נקשר אליה
pageName String הנתיב. מוסכמה: יחיד, למשל apps/mybusiness/Supplier
title String הכותרת בעברית. נכתבת גם כשורת ה‑H2 בראש הדף
siteId String האתר
JSON
{ "tableName": "Suppliers",
"pageName": "apps/mybusiness/Supplier",
"title": "פרטי ספק" }

התשובה היא { "pageId": "<24 hex>" }. מה שמתקבל: טופס ריק על המאסטר NewMaster, עם שורת כותרת (H2 עם ה‑title) ועוד שורה ריקה אחת בפריסת [6,6] שנושאת את המחלקה ai-placeHolder, ושורת footer עם כפתורי השמירה. זו השורה שממלאים ראשונה — במערכת vanilla המזהים שלה הם P272 (השורה) ו‑P268 (הטופס), אבל אל תקבעו אותם: קראו אותם מ‑Get-Page-Content.

המאסטר נקבע כאן ולתמיד — ראו דפי מאסטר.

כלי העבודה של הגריד והשדות. מקבל מערך פעולות מסודר שמבוצע לפי הסדר.

הפרמטר טיפוס חובה המשמעות
pageId String ה‑_id של הדף
actions Array<Object> הפעולות. לכל פעולה actionType חובה
siteId String האתר

ה‑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שניהם נדרשים

שלוש דרכים למקם, וכל פעולה שמציבה משהו משתמשת באחת מהן:

הפרמטרים המשמעות
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] תיאור + שדה צדדי
הפרמטר טיפוס המשמעות
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

רשימה נפתחת שנטענת מטבלה של אלפי רשומות (Accounts, _User) הופכת את הדף לאיטי ואת הבחירה לבלתי אפשרית. autocomplete: true מחליף את ה‑select בשדה חיפוש. לטבלאות lookup קטנות (סטטוסים, סוגים) — השאירו select.

הדוגמה מתיאור הכלי: בטופס יש CategoryId שמצביע ל‑Categories, ו‑SubCategoryId שמצביע ל‑SubCategories, כאשר SubCategories מחזיקה שדה Pointer ל‑Categories. אם רוצים שהרשימה של תת‑הקטגוריה תציג רק ערכים ששייכים לקטגוריה שנבחרה — מגדירים על שדה הבן:

JSON
{ "actionType": "add-new-field", "fieldName": "SubCategoryId", "fieldType": "Pointer",
"targetClass": "SubCategories", "subclassDepend": "Categories", "label": "תת-קטגוריה",
"toExistingRow": "P272", "toExistingColumn": 1 }

דוגמה — ממלאים את שורת ההתחלה ופותחים את הבאה

Section titled “דוגמה — ממלאים את שורת ההתחלה ופותחים את הבאה”
JSON
{ "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 שנוצר. זה המזהה שממלאים בקריאה הבאה.

  1. קודם יוצרים מקום, אחר כך ממלאים. add-row, קוראים את newRowId מהתשובה, ואז add-new-field לתוכה. כשיש תלות — קריאות נפרדות.
  2. בדיקת סכימה היא חובה — ורק אתם עושים אותה. הכלי אינו מאמת את fieldName מול הסכימה: שדה שאינו ב‑Get-Schema של המחלקה מתווסף לדף ב‑success: true. ראו כלי סכימה והמלכודת הראשונה.
  3. edit-row לפני שמזיזים שדות לעמודות חדשות — עמודת היעד חייבת להתקיים.
  4. אצווה עם אותו newRowAfterRow נכנסת בסדר הפוך. כל שורה חדשה נוחתת מיד אחרי העוגן, ולכן האחרונה במערך היא הראשונה בדף. כדי לקבל כותרת ← שדות ← גרפים, כתבו את הפעולות מלמטה למעלה.
  5. עיצוב מחדש = move-existing-field, לא add-new-field. שדה שכבר על הדף יחזיר Field already exists.
  6. מוציאים שדות ואז delete-row. מחיקת שורה מאוכלסת מאבדת את מה שבתוכה.
  7. פעולות בלתי תלויות מתאגדות יפה בקריאה אחת.
  8. שורה מקוננת עובדת בכל עמודה. add-row עם toExistingRow + toExistingColumn נוחתת בעמודה שביקשתם — גם בעמודה 1 ומעלה (באג מאפריל 2026 שקונן שגוי בעמודות ≥ 1 אומת כמתוקן ב‑23.08.2026). השורה המקוננת מקבלת newRowId משלה ב‑info[].

כרטיס קריא הוא חזרה על אותה תבנית: שורת כותרת [12] עם H2 ← שורות שדות [4,4,4] ← הכותרת הבאה. סדר מומלץ: זהות וסטטוס למעלה, פרטי התקשרות, תאריכים ומטא, טקסט חופשי ברוחב מלא, וטבלאות מקושרות בתחתית.

JSON
// אחרי 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.) שמות סקשן חייבים להיות ספציפיים — לעולם לא “פרטים נוספים”.

יוצר מיכל ריק — containerHolder > container — שנותן לאלמנטים שבתוכו את מראה הכרטיס הלבן עם המסגרת והצל.

הפרמטר טיפוס חובה המשמעות
pageId String הדף
toExistingRow String * שורה קיימת. דורש גם toExistingColumn
toExistingColumn Number מספר העמודה, 0‑based
afterElement String * מזהה אלמנט — המיכל ייווצר אחריו
intoExistingElemId String * לתוך אלמנט קיים. לא rDivider
isFullWidth Boolean רוחב מלא של הדף או של מיכל האב
isFullHeight Boolean גובה מינימלי של 100% מהמסך
siteId String האתר

* שלוש דרכי המיקום הן חלופיות — בוחרים אחת.

JSON
{ "pageId": "<id>", "toExistingRow": "P221", "toExistingColumn": 0,
"isFullWidth": false, "isFullHeight": false }

התשובה מחזירה שני מזהים:

JSON
{ "success": true, "pageId": "<id>",
"info": [ { "actionType": "add-container", "newContainerId": "P292", "innerContainerId": "P293" } ] }

newContainerId הוא המעטפת (containerHolder), innerContainerId הוא הכרטיס הלבן עצמו (container). innerContainerId הוא מה שמעבירים כ‑intoExistingElemId לכלי המונים, הגרפים והלשוניות — אלמנט שמוכנס ל‑newContainerId נוחת מחוץ לכרטיס, אחרי המיכל הפנימי. זו הדרך היחידה לקבל אלמנט דשבורד שנראה כמו האלמנטים המקוריים ולא כמו טקסט חשוף על הרקע. ראו אלמנטי דשבורד.

הכלי אינו מסרב ל‑intoExistingElemId של שורה (rDivider) — הוא פשוט מציב את המיכל כאח של העמודות, מחוץ לגריד. האזהרה שבסכימה היא באחריותכם.

משכפל אלמנט קיים במקומו: העותק נכנס מיד אחרי המקור, בתוך אותה עמודה או אותו מיכל, ומקבל — הוא וכל צאצאיו — מזהים חדשים וייחודיים. המקור לא נוגע.

הפרמטר טיפוס חובה המשמעות
pageId String הדף
elemId String האלמנט לשכפול. חייב לשאת את המחלקה simblaEL
siteId String האתר

השכפול מעתיק הכול: מבנה, מחלקות CSS, סגנונות inline, ו‑data‑attributes. שדה משוכפל שומר על ה‑name שלו; מונה משוכפל שומר על data-simbla-class, data-counter-function, data-criteria והפורמט; טבלה משוכפלת שומרת על העמודות שלה.

1. Duplicate-Element(pageId, elemId) העותק נוצר ליד המקור
2. Get-Page-Content(pageId, minimal:false) קוראים את המזהים החדשים של העותק
3. הכלי המתאים עם elemId של העותק ממקדים אותו מחדש

זה בדרך כלל מהיר ובטוח יותר מבנייה מאפס כשכבר קיים אלמנט דומה: מונה חדש שנבנה מאפס דורש tableName, counterFunction, criteria, format, css ומיקום; מונה משוכפל דורש רק את מה שמשתנה. עובד על כל סוג אלמנט — שורות טופס, מיכלים, מונים, גרפים, לשוניות, טבלאות תצוגה וטקסט.

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-TableGet-Schema לאימות ← Edit-Page.

2. הסרה מדף אינה מחיקה מהסכימה

Section titled “2. הסרה מדף אינה מחיקה מהסכימה”

remove-existing-field מוריד את השדה מה‑HTML של הדף. השדה, והנתונים שבו, נשארים ב‑DB — והוא ימשיך להופיע ב‑Get-Schema, ב‑Get-Optional-Fields ובבורר העמודות של טבלאות התצוגה.

זו התנהגות נכונה (אין מחיקה בשוגג של נתונים), אבל היא מפילה שתי ציפיות: “הורדתי אותו מהדף אז הוא נעלם” — לא נכון; ו“אני צריך למחוק את השדה” — זה קיים רק בממשק הניהול או ב‑REST עם Master Key, ומוחק גם את הנתונים.

  • אין Delete-Element. אלמנט שלא רוצים מסתירים ב‑CSS (#elemId{display:none!important}) או מוחקים את השורה כולה כשהיא מתפנה.
  • כל עריכת דף דורשת רענון בדפדפן כדי להופיע. אחרי שינוי בקובץ JS/CSS חיצוני — רענון קשיח (Ctrl+F5).
  • גבו לפני שינוי גדול. גרסאות הדף הן מנגנון ה‑undo היחיד.