סקילים — דפים וממשק
ארבעה סקילים שעובדים על מה שהמשתמש רואה. שכבת הנתונים כבר קיימת (ישויות ושדות); כאן מדובר בדפים, ברשתות ובאלמנטים שיושבים עליהם.
| הסקיל | על מה הוא עובד |
|---|---|
myb-p-page-builder |
דף כרטיס — טופס של רשומה אחת |
myb-p-page-tables |
כל simbla-table — בדף רשימה או משובצת בכרטיס |
myb-p-dashboards |
דף דשבורד — מונים, גרפים וטבלה |
myb-p-create-settings-page |
דף ניהול ערכים בסגנון System-Tables-* |
myb-p-page-builder
Section titled “myb-p-page-builder”בונה, מעצב ומשפץ דפי כרטיס — הטופס של רשומה בודדת: לקוח, מכירה, פנייה, או כל ישות מותאמת.
מבנה דף כרטיס
Section titled “מבנה דף כרטיס”┌─────────────────────────────────────────────┐│ _MPID1: סרגל עליון (חזרה + כותרת) │├─────────────────────────────────────────────┤│ _MPID0: תוכן ראשי — הטופס ││ ┌─────────────────────────────────────┐ ││ │ כותרת סקשן: "פרטי לקוח" │ ││ │ ┌──────────┬──────────┬──────────┐ │ ││ │ │ שדה 1 │ שדה 2 │ שדה 3 │ │ ││ │ │ col-4 │ col-4 │ col-4 │ │ ││ │ └──────────┴──────────┴──────────┘ │ ││ │ כותרת סקשן: "פרטי התקשרות" │ ││ │ ... │ ││ │ הערות (col-12, רוחב מלא) │ ││ │ │ ││ │ טבלאות קשורות: [משימות][פעילויות] │ ││ └─────────────────────────────────────┘ │├─────────────────────────────────────────────┤│ _MPID2: סרגל תחתון (שמירה/מחיקה) │└─────────────────────────────────────────────┘כל סקשן חוזר על אותה תבנית: שורת כותרת (col-12 עם אלמנט H2) ← שורות שדות (בדרך כלל [4,4,4]) ← הסקשן הבא.
פריסת הרשת
Section titled “פריסת הרשת”| הפריסה | 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.
רצף הבנייה
Section titled “רצף הבנייה”// א. שורת כותרת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.
מה לא נתמך
Section titled “מה לא נתמך”- טאבים (
simbla-nav) — הסקיל אומר שאי אפשר ליצור דרך MCP, אבל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) ומרונדר כקלט שלא נשמר לשום מקום (mcp-c-06). לכן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".
שדות טקסט חופשי
Section titled “שדות טקסט חופשי”שדה String שמוצב ב‑Edit-Page נרנדר תמיד כ‑<input type="text"> בשורה אחת — גם Comment, Description ו‑Notes (מאומת בדפדפן; הסקיל טוען שהשמות האלה הופכים ל‑textarea, וזה נכון רק לווידג’ט ה‑Comment של דפי התבנית המובנים, לא לשדות שהסוכן מוסיף). התיקון לטקסט ארוך הוא JS על הדף:
$(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) ); } });});שכפול במקום בנייה מחדש
Section titled “שכפול במקום בנייה מחדש”Duplicate-Element(pageId, elemId) משכפל לעומק כל אלמנט שנושא את המחלקה simblaEL — העותק נוחת מיד אחרי המקור עם מזהים חדשים לגמרי, וכל המחלקות, הסגנונות והקישורים נשמרים.
מתי כן: טבלת רשומות קשורות שכבר מוגדרת (משכפלים ואז Edit-Table-View מפנה אותה לטבלה אחרת), כותרת סקשן מעוצבת, בלוק טקסט.
myb-p-page-tables
Section titled “myb-p-page-tables”“טבלת דף” היא האלמנט <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 והוא לא שואל מאיזה סוג.
בחירת הכלי
Section titled “בחירת הכלי”דף רשימה חדש (טופס חיפוש + טבלה) → 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-FieldsEdit-Table-View הוא כותב‑מצב‑מלא
Section titled “Edit-Table-View הוא כותב‑מצב‑מלא”כל קריאה מחליפה את המערך או האובייקט כולו. מה שלא כללתם — נמחק. זה נכון ל:
columnsoptionalFieldsclassPointerscriteria(בתוךfilterAndSort)conditionalFormattingRules
מה Edit-Table-View לא נוגע בו: טופס החיפוש <form class="dbFormQuery">, ה‑jsCode/cssCode המוטבעים, ה‑HTML של המודאל, וה‑SEO title. כשמשהו נראה שבור — זו השאלה הראשונה: הבעיה על אלמנט הטבלה, או על הדף סביבו?
aggrField אינו אופציונלי
Section titled “aggrField אינו אופציונלי”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.
אבחון לפי תסמין
Section titled “אבחון לפי תסמין”| התסמין | המקום הראשון לבדוק |
|---|---|
| ווידג’ט משובץ מציג 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כותב כותרות בלי האייקון, ואף אחד לא מבחין עד שמשתמש לוחץ. התיקון — הוספת האייקון פעם אחת בטעינה:
$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>'); }});myb-p-dashboards
Section titled “myb-p-dashboards”דשבורד ב‑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 של המונים והגרפים מצביע אליו. לכן בניית דשבורד חדש היא בעיקר שכפול והפניה מחדש, לא בנייה מאפס.
הזרימה, בסדר
Section titled “הזרימה, בסדר” 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 עלול להיות במטמוןהפניית מונה או גרף
Section titled “הפניית מונה או גרף”Add-Edit-Counter-Element({ "pageId": "<id>", "elemId": "P33", "tableName": "Suppliers", "counterFunction": "sum", "counterField": "TotalPurchases", "format": "0,0", "criteria": []})counterFunction ∈ sum-count · sum · avg · min · max. counterField נדרש בכל ערך מלבד sum-count — אבל הכלי לא אוכף זאת (sum בלי counterField מתקבל ומייצר מונה ריק). tableName נדרש גם בעריכה לפי elemId (אחרת Table name not found in schema, mcp-c-11). ה‑format הוא פורמט של Numeral.js ("0,0.00").
הסכימה החיה של ה‑criteria באלמנטים האלה מגדירה enum מצומצם של אופרטורים: contains, startsWith, equalTo, greaterThan, lessThan, greaterThanOrEqualTo, lessThanOrEqualTo, notEqualTo, containedIn, notContainedIn. exists איננו ברשימה — מי שרוצה לסנן ערכי null מגרף עוגה יסנן ל‑containedIn עם הערכים המוכרים.
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>") (מאומת — השורה נוחתת בתוך ה‑container). אם הקריאה נדחית ב‑newRowAfterRow or toExistingRow is required (נצפה פעם אחת על דשבורד מועתק), מוסיפים toExistingRow של שורה קיימת כלשהי — ה‑intoExistingElemId גובר והשורה נכנסת למיכל.
אין כלי MCP לאייקון — משתמשים באלמנט טקסט עם <i class="fa fa-…">. הגבול של הכרטיס (data-border-type="All") הוא מתג בעורך, בלי פרמטר MCP.
שילוב בתפריט הדשבורדים
Section titled “שילוב בתפריט הדשבורדים”Get-Menus() // מאתרים את "CRM-Menu" (לא "Dashboard Menu")Get-Menu-Items({ "menuId": "<crmMenuId>" }) // מוצאים את הפריט "מבט-על" ← ה-_id שלו הוא ה-parentSet-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 נופלים בשקט למצב ללא‑סינון: המשתמש לוחץ “הפעל” ושום דבר לא משתנה.
myb-p-create-settings-page
Section titled “myb-p-create-settings-page”בונה דף הגדרות שנראה ומתנהג כמו דפי ה‑System-Tables‑* המובנים: כותרת עם גלגל שיניים, ניווט צד של ההגדרות, כרטיס לבן, טבלה בעריכה‑בשורה עם כפתור “הוסף ערך”, וקישור “< חזרה להגדרות”. המשתמש מנהל שם את הערכים של טבלת lookup קטנה — סטטוסים, סוגים, עדיפויות.
הסקיל הזה רץ אחרי שהטבלה כבר קיימת. הוא לא יוצר אותה — לזה יש Create-Table או myb-p-create-entity.
למה מעתיקים דף מובנה
Section titled “למה מעתיקים דף מובנה”אין כלי MCP שבונה את פריסת ה‑System-Tables מאפס — כותרת גלגל שיניים + ניווט צד + כרטיס לבן + טבלה + קישור חזרה. המסלול האמין הוא להעתיק דף System-Tables-* קיים ולהפנות אותו מחדש; ההעתקה מביאה את כל ה‑chrome בחינם.
תבניות טובות (כולן מנהלות ערכי lookup בעריכה‑בשורה): System-Tables-Task-Statuses · System-Tables-Sale-Statuses · System-Tables-Case-Statuses. מזהי הדפים שונים בין לקוחות — תמיד Get-Site-Pages, אף פעם לא ערך קשיח.
שתי תקלות ידועות בהעתקה
Section titled “שתי תקלות ידועות בהעתקה”הקונפיגורציה
Section titled “הקונפיגורציה”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" הוא מה שמציג את כל השורות בלי טופס חיפוש — בדיוק כמו בדפים המובנים.
הרשאות — התנאי המקדים
Section titled “הרשאות — התנאי המקדים”טבלת ה‑lookup חייבת CLP מבוסס‑תפקידים. ה‑front-end בודק חברות בתפקיד, ובלי זה העריכה בשורה זורקת “אין הרשאות”. ההיגיון הרגיל בדף הגדרות: קריאה לכל מי שמשתמש בערכים, כתיבה למנהלים בלבד:
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 מחליף אותו בטעינה — זה מקובל, וזו בדיוק הדרך שבה דפי ההגדרות המובנים מחברים את ההתנהגות שלהם.
- סקילים — אוטומציה — חוקי טופס יושבים על אותם דפי כרטיס
- עריכת דפים ב‑MCP · אלמנטי דשבורד
- עבודה בטוחה עם סוכן על מערכת חיה — הכלים שדורסים ולא ממזגים