דלגו לתוכן

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

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

סקילים — דפים וממשק

עודכן 30.08.2026

ארבעה סקילים שעובדים על מה שהמשתמש רואה. שכבת הנתונים כבר קיימת (ישויות ושדות); כאן מדובר בדפים, ברשתות ובאלמנטים שיושבים עליהם.

הסקיל על מה הוא עובד
myb-p-page-builder דף כרטיס — טופס של רשומה אחת
myb-p-page-tables כל simbla-table — בדף רשימה או משובצת בכרטיס
myb-p-dashboards דף דשבורד — מונים, גרפים וטבלה
myb-p-create-settings-page דף ניהול ערכים בסגנון System-Tables-*

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

┌─────────────────────────────────────────────┐
│ _MPID1: סרגל עליון (חזרה + כותרת) │
├─────────────────────────────────────────────┤
│ _MPID0: תוכן ראשי — הטופס │
│ ┌─────────────────────────────────────┐ │
│ │ כותרת סקשן: "פרטי לקוח" │ │
│ │ ┌──────────┬──────────┬──────────┐ │ │
│ │ │ שדה 1 │ שדה 2 │ שדה 3 │ │ │
│ │ │ col-4 │ col-4 │ col-4 │ │ │
│ │ └──────────┴──────────┴──────────┘ │ │
│ │ כותרת סקשן: "פרטי התקשרות" │ │
│ │ ... │ │
│ │ הערות (col-12, רוחב מלא) │ │
│ │ │ │
│ │ טבלאות קשורות: [משימות][פעילויות] │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ _MPID2: סרגל תחתון (שמירה/מחיקה) │
└─────────────────────────────────────────────┘

כל סקשן חוזר על אותה תבנית: שורת כותרת (col-12 עם אלמנט H2) ← שורות שדות (בדרך כלל [4,4,4]) ← הסקשן הבא.

הפריסה columnSize מתי
3 עמודות [4, 4, 4] ברירת המחדל לרוב השדות
2 עמודות [6, 6] תוויות ארוכות או שדות רחבים
רוחב מלא [12] כותרות סקשן, Comment/textarea
4 עמודות [3, 3, 3, 3] שדות קומפקטיים (צ’קבוקסים, selects קצרים)
רחב + צר [9, 3] או [8, 4] תיאור + שדה קטן

מספור עמודות הוא 0‑based: העמודה הראשונה היא toExistingColumn: 0.

JSON
// א. שורת כותרת
Edit-Page({ "pageId": "<id>", "actions": [
{ "actionType": "add-row", "columnSize": [12], "newRowAfterRow": "<lastRowId>" }
]})
// התשובה: info[0].newRowId → "P360"
// ב. טקסט הכותרת
Add-Edit-Text-Element({
"pageId": "<id>", "elemType": "H2",
"html": "<font color=\"#3249b3\" style=\"font-size: 24px;\">פרטי לקוח</font>",
"rowId": "P360", "columnNumber": 0
})
// ג. שורת שדות
Edit-Page({ "pageId": "<id>", "actions": [
{ "actionType": "add-row", "columnSize": [4, 4, 4], "newRowAfterRow": "P360" }
]})
// ד. השדות — כאן אפשר לאגד כמה בקריאה אחת
Edit-Page({ "pageId": "<id>", "actions": [
{ "actionType": "add-new-field", "fieldName": "Name", "label": "שם",
"fieldType": "String", "toExistingRow": "P364", "toExistingColumn": 0 },
{ "actionType": "add-new-field", "fieldName": "AccountId", "label": "לקוח",
"fieldType": "Pointer", "targetClass": "Accounts",
"toExistingRow": "P364", "toExistingColumn": 1 }
]})

צעדים א–ג חייבים לרוץ ברצף (כל אחד תלוי במזהה מהקודם); צעד ד יכול לאגד כמה שדות.

Edit-Page — סוגי הפעולות בסכימה החיה

Section titled “Edit-Page — סוגי הפעולות בסכימה החיה”
actionType מה הוא עושה
add-new-field מוסיף שדה קיים בסכימה לדף
move-existing-field מזיז שדה שכבר על הדף
remove-existing-field מסיר מהדף — לא מהסכימה
change-existing-field-label משנה תווית
set-field-required מסמן כשדה חובה
add-row / edit-row / delete-row ניהול שורות ופריסת עמודות
move-existing-object מזיז אלמנט לפי מזהה (ב‑fieldName)
set-html-content מציב HTML לתוך אלמנט — דורש htmlContent + intoExistingElemId

פרמטרים נוספים לשדות: targetClass (חובה ל‑Pointer), subclassDepend (רשימות נגזרות), autocomplete, isRequired, defaultValue, intoExistingElemId.

  • טאבים (simbla-nav) — יצירת מיכל טאבים חדש כן אפשרית, עם Add-Edit-Tabs-Element (rowId + columnNumber + newTabs; נוצר <div class="simblaEL simbla-nav"> עם הטאבים). מה שעדיין אין: הזרקת שדות/טבלאות לתוך טאב ספציפי ב‑Edit-Page. טבלאות קשורות מתווספות כסקשנים נפרדים.
  • קווי הפרדה (separatorElm) — נבנים בעורך בלבד. משתמשים בכותרות סקשן כשבירה חזותית.
  • עריכת מאסטר — הסקיל עובד על דפי טופס, לא על TicketMaster / CRMmaster.
  • גרירה ושחרור — MCP מציב לפי מזהי שורה ועמודה; סידור ידני חזותי דורש את העורך.

המלכודות שהסקיל מתעד, ואלה שחוזרות

Section titled “המלכודות שהסקיל מתעד, ואלה שחוזרות”

סדר וזהות שורות

  • מזהי שורה חוזרים ב‑info[] של התשובה — אין צורך לפרסר HTML.
  • Get-Page-Content(minimal: true) מחזיר YAML קריא. תמיד להשתמש בו לניתוח מבנה קיים.
  • move-existing-object על שורה שמכילה שדות מייתם אותם. מזיזים שדות אחד‑אחד עם move-existing-field, מוחקים את השורה הריקה, ובונים חדשה.
  • delete-row רק על שורה ריקה. מחיקת שורה עם שדות מאבדת אותם מהדף.
  • edit-row לפני הזזת שדות. מעבר מ‑[6,6] ל‑[4,4,4] נעשה קודם — אחרת העמודה השלישית עוד לא קיימת.

כתיבה שדורסת

  • Edit-Page-CSS-JS דורס את כל הבלוק. קוראים את הקיים דרך Get-Page-Content, ממזגים, ורק אז כותבים.

שגיאות טיפוסיות

  • “Field already exists” — בשיפוץ דף קיים, שדה שכבר על הדף מקבל move-existing-field ולא add-new-field. תמיד להצליב מול ה‑YAML הנוכחי.
  • שדה חייב להתקיים בסכימה לפני שמציבים אותו — אבל Edit-Page לא בודק: שדה שאינו בסכימה נוסף לדף בהצלחה (success: true) ומרונדר כקלט שלא נשמר לשום מקום. לכן Get-Schema הוא צעד חובה שלכם, לא של הכלי.
  • שם שדה חייב להתאים ל‑/^[A-Za-z][A-Za-z0-9_]*$/.

טבלאות קשורות

  • Add-Table-View-to-Form-Page מייצר לבד שורת כותרת עם ה‑tableTitle. אין צורך ליצור אותה ידנית.
  • כמה טבלאות שמוזרקות לאותו insertAfterRow מוערמות בסדר הפוך. כדי לקבל משימות ← פעילויות ← הערות, מזריקים אותן בסדר הפוך.
  • טיפוסי השדות בכלי הזה אינם כוללים Pointer: רק String, Number, Boolean, Date, PrivateFile, File. להצגת Pointer — fieldName: "PointerField.TargetField" עם type: "String".

שדה String שמוצב ב‑Edit-Page נרנדר תמיד כ‑<input type="text"> בשורה אחת — גם Comment, Description ו‑Notes. השמות האלה הופכים ל‑textarea רק בווידג’ט ה‑Comment של דפי התבנית המובנים, לא בשדות שמוסיפים לדף. התיקון לטקסט ארוך הוא JS על הדף:

JavaScript
$(document).ready(function () {
['Resolution', 'RootCause', 'TechnicianNotes', 'Summary'].forEach(function (fieldName) {
var $input = $('input[name="' + fieldName + '"]');
if ($input.length && $input.attr('type') === 'text') {
$input.replaceWith(
$('<textarea>')
.attr('name', fieldName)
.attr('id', $input.attr('id'))
.addClass($input.attr('class'))
.val($input.val())
.attr('rows', 3)
);
}
});
});

Duplicate-Element(pageId, elemId) משכפל לעומק כל אלמנט שנושא את המחלקה simblaEL — העותק נוחת מיד אחרי המקור עם מזהים חדשים לגמרי, וכל המחלקות, הסגנונות והקישורים נשמרים.

מתי כן: טבלת רשומות קשורות שכבר מוגדרת (משכפלים ואז Edit-Table-View מפנה אותה לטבלה אחרת), כותרת סקשן מעוצבת, בלוק טקסט.


“טבלת דף” היא האלמנט <div class="simbla-table"> שמרנדר רשומות. הוא הבעלים של העמודות, קריטריוני החיפוש, המיון, העימוד, מצב העריכה, העיצוב המותנה, שורות הסיכום, העריכה מרובת‑השורות והייצוא לאקסל.

שני טעמים, אותו כלי:

הטעם איפה נוצר על ידי
dynamic-data-table דף רשימה עצמאי (apps/mybusiness/Accounts) Create-Table-View-Page
data-table משובצת שורה בתוך דף כרטיס (טבלת מכירות על כרטיס הלקוח) Add-Table-View-to-Form-Page

Edit-Table-View עובד על שניהם — מפנים אותו ל‑tableId והוא לא שואל מאיזה סוג.

דף רשימה חדש (טופס חיפוש + טבלה)
→ Create-Table-View-Page
ואז Edit-Table-View — לניקוי השאריות של Cases
ואז Set-Page-Settings — לתיקון ה-SEO title המורש
שינוי עמודות/סינון/מיון/מצב עריכה בטבלה קיימת
→ Edit-Table-View
ווידג'ט של רשומות קשורות על כרטיס
→ Add-Table-View-to-Form-Page
ואז Edit-Table-View — הכלי המשבץ משאיר aggrField כ-"undefined"
אילו שדות זמינים למחלקה
→ Get-Optional-Fields

Edit-Table-View הוא כותב‑מצב‑מלא

Section titled “Edit-Table-View הוא כותב‑מצב‑מלא”

כל קריאה מחליפה את המערך או האובייקט כולו. מה שלא כללתם — נמחק. זה נכון ל:

  • columns
  • optionalFields
  • classPointers
  • criteria (בתוך filterAndSort)
  • conditionalFormattingRules

מה Edit-Table-View לא נוגע בו: טופס החיפוש <form class="dbFormQuery">, ה‑jsCode/cssCode המוטבעים, ה‑HTML של המודאל, וה‑SEO title. כשמשהו נראה שבור — זו השאלה הראשונה: הבעיה על אלמנט הטבלה, או על הדף סביבו?

field שולט במה שמוצג. aggrField שולט במה שצינור האגרגציה מאחורי המיון, הסינון והסיכום באמת שואל. לשדות ישירים הם זהים; ל‑Pointers, ה‑aggrField משלב את שם מחלקת היעד:

field aggrField
Name Name
AccountId.Name AccountId.Accounts.Name
StatusId.Color StatusId.SupplierStatuses.Color
OwnerId.name OwnerId._User.name
createdBy.name createdBy._User.name

אל תבנו aggrField מהאינטואיציה — העתיקו את הערך המדויק מ‑Get-Optional-Fields(className).

ווידג’ט רשומות קשורות — ומלכודת המיקום

Section titled “ווידג’ט רשומות קשורות — ומלכודת המיקום”

טבלת הבן חייבת שיהיה לה שדה Pointer שה‑targetClass שלו הוא מחלקת הכרטיס. כשהווידג’ט ממוקם נכון — ברמת הטופס — הפלטפורמה מסננת אותו אוטומטית לרשומות של הרשומה הפתוחה, בלי שום criteria.

Add-Table-View-to-Form-Page מחליט על העטיפה לפי מה שנמצא מיד אחרי שורת היעד ב‑HTML. אם השכן הבא הוא אלמנט “מורכב” — מיכל טאבים, ווידג’ט אחר — הכלי מקנן את הווידג’ט בתוכו במקום להציב אותו כאח אמיתי.

יעד בטוח ל‑insertAfterRow יעד מסוכן
השורה הראשונה בטופס (שורת הכותרת) השורה האחרונה לפני מיכל טאבים (simbla-nav)
כל שורה שהשכן הבא שלה הוא שורת שדות רגילה כל שורה שכבר נמצאת בתוך ווידג’ט אחר

התסמין: הווידג’ט מציג 0 רשומות על כרטיס שיש לו ילדים — או מציג את כל הרשומות במקום רק את של ההורה. אחרי ההוספה, מטפסים על ההורים של הווידג’ט ב‑Get-Page-Content ומוודאים שאף אחד מהם אינו simbla-nav או simbla-table.

התסמין המקום הראשון לבדוק
ווידג’ט משובץ מציג 0 רשומות מיקום — לטפס על ההורים
ווידג’ט משובץ מציג את כל הרשומות אותו דבר — הסינון האוטומטי יורה רק ברמת טופס
מיון/סינון שבור על עמודת Pointer classPointers חסרה את אותו Pointer
מיון “עובד” אבל מחזיר סדר שגוי aggrField לא תואם לשם המחלקה בסכימה
שדות שגויים בבורר העמודות optionalFields מורשים מהמקור — לדרוס
טופס החיפוש מציג שדות של מחלקה אחרת data-simbla-class עדיין של מחלקת המקור — Edit-Page

שתי מלכודות ציטוט וסידור

Section titled “שתי מלכודות ציטוט וסידור”
  • showSummary עם גרש כפול נשבר. ב‑Add-Table-View-to-Form-Page מעבירים placeholder בלי מרכאות ("סהכ"), ואת התווית האמיתית קובעים אחר כך: Edit-Table-View(summaryOptions: { showSum: true, sumTitle: "סה\"כ" }).
  • מיון לפי כותרת נעלם בשקט בטבלאות שנבנו בכלי. המיון הילידי נקשר רק כאשר ה‑<th> מכיל <i class="fa fa-sort">. Edit-Table-View כותב כותרות בלי האייקון, ואף אחד לא מבחין עד שמשתמש לוחץ. התיקון — הוספת האייקון פעם אחת בטעינה:
JavaScript
$t.find('thead th[data-field]').not('[data-field="action"]').each(function () {
if (!$(this).find('[class*="fa-sort"]').length) {
$(this).append('<i class="fa fa-sort"></i>');
}
});

דשבורד ב‑MyBusiness הוא דף רגיל עם masterPageId = CRMmaster — אותו מאסטר של דפי הרשימה. מה שהופך אותו לדשבורד הוא התוכן: טופס סינון תאריכים, אלמנטי מונה וגרף, וטבלה משובצת.

apps/mybusiness/DashboardX (masterPageId = CRMmaster)
├── שורת כותרת: אייקון + H2 + <form name="genericform"> עם FromDate/ToDate
└── שורה ראשית (col-md-7 + col-md-5)
├── col-md-7: טופס מונים → 2 כרטיסי KPI → טופס גרפים → 4 גרפים
└── col-md-5: טופס מפה → גרף + spacer + simbla-table

התובנה שחוסכת שעות: כל הדשבורדים הקיימים — DashboardSales, DashboardLeads, DashboardCaseManager, DashboardGenManager — חולקים את אותו שלד. הם נבדלים רק במה שה‑data-simbla-class של המונים והגרפים מצביע אליו. לכן בניית דשבורד חדש היא בעיקר שכפול והפניה מחדש, לא בנייה מאפס.

1. Get-Site-Pages → מזהה דשבורד המקור
2. Get-Schema(targetTable) → שדות ויחסי Pointer
3. Get-Data(targetTable, limit: 5) → יש בכלל נתונים?
4. Create-Table-View-Page(copyFromPageId) → השכפול
5. Set-Page-Settings(title) → תיקון ה-SEO title
6. Get-Page-Content(minimal: false) → מיפוי כל ה-elemId
7. Add-Edit-Counter-Element(elemId) × N → מונים
8. Add-Edit-Chart-Element(elemId) × M → גרפים
9. Add-Edit-Text-Element(elemId) × K → כותרות וכיתובים
10. Edit-Table-View(tableId) → הטבלה המשובצת
11. Edit-Page-CSS-JS(jsCode) → שחזור טופס התאריכים
12. Get-Menus + Set-Menu-Items → שילוב בתפריט הדשבורדים
13. רענון קשה (Ctrl+F5) → dashboardSales.js עלול להיות במטמון
JSON
Add-Edit-Counter-Element({
"pageId": "<id>", "elemId": "P33",
"tableName": "Suppliers",
"counterFunction": "sum",
"counterField": "TotalPurchases",
"format": "0,0",
"criteria": []
})

counterFunctionsum-count · sum · avg · min · max. counterField נדרש בכל ערך מלבד sum-count — אבל הכלי לא אוכף זאת (sum בלי counterField מתקבל ומייצר מונה ריק). tableName נדרש גם בעריכה לפי elemId (אחרת Table name not found in schema). ה‑format הוא פורמט של Numeral.js ("0,0.00").

הסכימה החיה של ה‑criteria באלמנטים האלה מגדירה enum מצומצם של אופרטורים: contains, startsWith, equalTo, greaterThan, lessThan, greaterThanOrEqualTo, lessThanOrEqualTo, notEqualTo, containedIn, notContainedIn. exists איננו ברשימה — מי שרוצה לסנן ערכי null מגרף עוגה יסנן ל‑containedIn עם הערכים המוכרים.

JSON
Add-Edit-Chart-Element({
"pageId": "<id>", "elemId": "P52",
"tableName": "Suppliers",
"chartType": "Doughnut", "chartTheme": "icecream",
"chartLabel": "StatusId.SupplierStatuses.Name",
"chartFunc": "sum-count",
"criteria": []
})

לגרפי Bar/Line מוסיפים chartValue (שדה מספרי), ולציר תאריכים chartLabelFormat (mm/yy, dd/mm/yy, q/yy, yy).

ערכות הצבע: icecream, rainyday, bluesky, grasshopper, partytime, simbla, romantic, heatwave, blooming, sunnysummer, underthesea, coldmountain, oldtown, daydream.

הרחבת דשבורד קיים — מבנה, לא CSS

Section titled “הרחבת דשבורד קיים — מבנה, לא CSS”

כשמוסיפים סקשן חדש בתחתית, הכלל היחיד שמשנה: כל כרטיס יושב במיכל אמיתי.

שורת כותרת [12]
└── Add-Edit-Text-Element(rowId, columnNumber: 0, elemType: "H2") ← כותרת לא צריכה מיכל
שורת כרטיסים [6,6]
├── עמודה 0: Add-Container-to-Page(toExistingRow, toExistingColumn: 0) → innerContainerId
│ Add-Edit-Text-Element(intoExistingElemId: innerContainerId) ← כותרת קודם
│ Add-Edit-Chart-Element(intoExistingElemId: innerContainerId) ← ואז הגרף
└── עמודה 1: אותו דבר
רווח לפני השורה הבאה
└── Add-Container-to-Page(afterElement: <rowId>) ← מיכל ריק = הרווח הילידי

הוספת גרף או מונה ישירות לעמודה (rowId + columnNumber) משאירה אותו חשוף, בלי containerHolder/container — כלומר בלי אלמנט “Container” בעורך של Simbla, והוא נראה ומתנהג אחרת מהכרטיסים המשוכפלים.

רווחים נבנים ממיכלים ריקים, לא מ‑margins. בדשבורדים הילידיים המיכלים הריקים P159, P210, P116 הם הרווח האנכי. לעולם לא לזייף כרטיסים או רווחים עם Edit-Page-CSS-JS.

כרטיס KPI — שתי פריסות ילידיות

Section titled “כרטיס KPI — שתי פריסות ילידיות”

פריסה A — אנכית (DashboardSales; מספר ~30px, אייקון פשוט):

container
├─ שורה [3,3,3,3] ריק | מונה(עמ' 1) | אייקון(עמ' 2) | ריק
└─ שורה [12] כיתוב אפור ממורכז

פריסה B — אופקית (DashboardLeads; מספר ~36px, אייקון כעיגול צבעוני):

container
└─ שורה [3,5,4] עיגול-אייקון(0) | כיתוב 2 שורות(1) | מונה(2)

בשתיהן, קינון שורה בתוך מיכל נעשה עם Edit-Page(add-row, intoExistingElemId: "<innerContainerId>"). אם הקריאה נדחית ב‑newRowAfterRow or toExistingRow is required (קורה על דשבורד מועתק), מוסיפים toExistingRow של שורה קיימת כלשהי — ה‑intoExistingElemId גובר והשורה נכנסת למיכל.

אין כלי MCP לאייקון — משתמשים באלמנט טקסט עם <i class="fa fa-…">. הגבול של הכרטיס (data-border-type="All") הוא מתג בעורך, בלי פרמטר MCP.

שילוב בתפריט הדשבורדים

Section titled “שילוב בתפריט הדשבורדים”
JSON
Get-Menus() // מאתרים את "CRM-Menu" (לא "Dashboard Menu")
Get-Menu-Items({ "menuId": "<crmMenuId>" }) // מוצאים את הפריט "מבט-על" ← ה-_id שלו הוא ה-parent
Set-Menu-Items({ "menuId": "<crmMenuId>", "items": [{
"type": "page", "page": "<newPageId>", "title": "ספקים",
"parent": "<_id של מבט-על>",
"icon": "fa fa-handshake-o",
"order": 7,
"visibility": []
}]})

טופס התאריכים — עוקף מתועד

Section titled “טופס התאריכים — עוקף מתועד”

Create-Table-View-Page דורס את שדה ה‑FromDate בטופס genericform בקלט String בשם Name, ומסיר את ToDate לגמרי — רק כשמעבירים searchFields (העתקה בלי searchFields, גם עם tableColumns, משאירה את FromDate/ToDate במקומם). לכן בשכפול דשבורד לא מעבירים searchFields. אם כבר נדרס: אין כלי MCP לעריכת קלטים בטפסים שאינם הטופס הראשי, ולכן משחזרים ב‑JS דרך Edit-Page-CSS-JS. בלי זה, הגרפים שמפנים ל‑genericform:FromDate נופלים בשקט למצב ללא‑סינון: המשתמש לוחץ “הפעל” ושום דבר לא משתנה.


בונה דף הגדרות שנראה ומתנהג כמו דפי ה‑System-Tables‑* המובנים: כותרת עם גלגל שיניים, ניווט צד של ההגדרות, כרטיס לבן, טבלה בעריכה‑בשורה עם כפתור “הוסף ערך”, וקישור “< חזרה להגדרות”. המשתמש מנהל שם את הערכים של טבלת lookup קטנה — סטטוסים, סוגים, עדיפויות.

הסקיל הזה רץ אחרי שהטבלה כבר קיימת. הוא לא יוצר אותה — לזה יש Create-Table או myb-p-create-entity.

אין כלי MCP שבונה את פריסת ה‑System-Tables מאפס — כותרת גלגל שיניים + ניווט צד + כרטיס לבן + טבלה + קישור חזרה. המסלול האמין הוא להעתיק דף System-Tables-* קיים ולהפנות אותו מחדש; ההעתקה מביאה את כל ה‑chrome בחינם.

תבניות טובות (כולן מנהלות ערכי lookup בעריכה‑בשורה): System-Tables-Task-Statuses · System-Tables-Sale-Statuses · System-Tables-Case-Statuses. מזהי הדפים שונים בין לקוחות — תמיד Get-Site-Pages, אף פעם לא ערך קשיח.

שתי תקלות ידועות בהעתקה

Section titled “שתי תקלות ידועות בהעתקה”
JSON
Edit-Table-View({
"pageId": "<new page id>",
"tableId": "<table id, e.g. P171>",
"tableClassName": "SupplierStatuses",
"classPointers": { "createdBy": "_User", "updatedBy": "_User" },
"columns": [
{ "field": "Name", "type": "String", "aggrField": "Name", "label": "ערך לסטטוס",
"inlineOptions": { "type": "text", "required": true, "readonly": false } },
{ "field": "Color", "type": "String", "aggrField": "Color", "label": "צבע",
"inlineOptions": { "type": "text", "required": false, "readonly": false } }
],
"editView": { "openFrom": "inline" },
"tablePermissions": { "allowCreate": true, "allowEdit": true, "allowDelete": true },
"filterAndSort": { "queryType": "hard-code", "sortBy": "Name",
"sortOrder": "ascending", "sortLimit": 50 }
})

queryType: "hard-code" הוא מה שמציג את כל השורות בלי טופס חיפוש — בדיוק כמו בדפים המובנים.

טבלת ה‑lookup חייבת CLP מבוסס‑תפקידים. ה‑front-end בודק חברות בתפקיד, ובלי זה העריכה בשורה זורקת “אין הרשאות”. ההיגיון הרגיל בדף הגדרות: קריאה לכל מי שמשתמש בערכים, כתיבה למנהלים בלבד:

JSON
Set-Table-Permissions({ "table": "SupplierStatuses", "classLevelPermissions": {
"find": { "role:CRM": true, "role:Admin": true, "role:Support": true },
"get": { "role:CRM": true, "role:Admin": true, "role:Support": true },
"create": { "role:Admin": true },
"update": { "role:Admin": true },
"delete": { "role:Admin": true },
"addField": {}
}})

ואת הדף עצמו סוגרים ב‑Set-Page-Settings(allowedRoles: "loggedOnly, Admin", loginOnly: true).

ניווט הצד — תוכן נשלט, קישור לא

Section titled “ניווט הצד — תוכן נשלט, קישור לא”

ניווט ההגדרות הוא אלמנט <nav class="menuHolder2" data-menu-id="…"> בתוך ה‑HTML של הדף שלכם, והוא נרנדר חי מהתפריט שה‑data-menu-id מצביע אליו — לא מתפריט ה‑Settings הגלובלי, ולא מה‑HTML השמור.

1. Get-Page-Content(pageId, minimal: false) → מוצאים את data-menu-id="XXXXXXXX"
2. Get-Menu-Items(menuId: "XXXXXXXX") → הפריטים חייבים להתאים למה שרואים בניווט
3. Set-Menu-Items(menuId: "XXXXXXXX", items: [{ title, type: "page", page, order }])
4. רענון רגיל — הניווט קורא נתוני תפריט, לא את קובץ ה-JS

כותרת הכרטיס — תיקון בצד לקוח

Section titled “כותרת הכרטיס — תיקון בצד לקוח”

הכותרת הפנימית של הכרטיס עדיין מציגה את הטקסט של התבנית (למשל “סטטוסי משימות”), ואין כלי MCP לעריכת אלמנט טקסט חופשי. התיקון נעשה בקובץ JS קטן שגם מוסיף את שאר הפינישים (loader, הדגשת “נוכחי” בניווט, דגימת צבע לכל שורה). ה‑HTML השמור נשאר עם הטקסט הישן וה‑JS מחליף אותו בטעינה — זה מקובל, וזו בדיוק הדרך שבה דפי ההגדרות המובנים מחברים את ההתנהגות שלהם.